У меня есть свойство профиля Asp.net Profile.Location, Gender и т. Д.
мне нужно получить список всех пользователей, чье местоположение принадлежит "Лондон" и пол = мужской
как выполнить поиск в профиле Asp.net с помощью LINQ
У меня есть свойство профиля Asp.net Profile.Location, Gender и т. Д.
мне нужно получить список всех пользователей, чье местоположение принадлежит "Лондон" и пол = мужской
как выполнить поиск в профиле Asp.net с помощью LINQ
Собственно, вы можете это сделать. Но сначала вам нужно сделать пару вещей:
Вот написанная мной функция CLR, которая анализирует значения столбцов PropertyNames и PropertyValuesString из таблицы aspnet_Profile. Он возвращает таблицу со столбцом «Свойство» и столбцом «Значение».
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
private static readonly Regex ProfileRegex = new Regex(@"([a-zA-Z]+):[A-Z]:(\d+):(\d+)");
[SqlFunction(FillRowMethodName = "FillProfileRow",TableDefinition="Property nvarchar(250), Value nvarchar(2000)")]
public static IEnumerable ParseProfileString(SqlString names, SqlString values)
{
var dict = ProfileRegex
.Matches(names.Value)
.Cast<Match>()
.ToDictionary(
x => x.Groups[1].Value,
x => values.Value.Substring(int.Parse(x.Groups[2].Value), int.Parse(x.Groups[3].Value)));
return dict;
}
public static void FillProfileRow(object obj, out string Property, out string Value)
{
var x = (KeyValuePair<string, string>) obj;
Property = x.Key;
Value = x.Value;
}
};
Разверните эту функцию, а затем создайте представление для данных профиля вашего пользователя. Вот пример:
CREATE VIEW UsersView
AS
SELECT *
FROM (
SELECT u.UserId
,u.Username
,m.Email
,f.Property
,f.Value
FROM aspnet_Profile p
INNER JOIN aspnet_Users u ON p.UserId = u.UserId
INNER JOIN aspnet_Membership m ON m.UserId = u.Userid
INNER JOIN aspnet_Applications a ON a.ApplicationId = m.ApplicationId
CROSS APPLY ParseProfileString(p.PropertyNames, p.PropertyValuesString) f
WHERE a.ApplicationName = 'MyApplication'
) src
pivot(min(value) FOR property IN (
-- list your profile property names here
FirstName, LastName, BirthDate
)) pvt
Вуаля, вы можете запросить представление с помощью SQL или ORM по вашему выбору. Я написал это в Linqpad:
from u in UsersView
where u.LastName.StartsWith("ove")
select u
Нет, вы не можете сделать это с помощью поставщика профиля ASP.NET по умолчанию (который сохраняет данные профиля в одном строковом поле в базе данных), хотя вы все равно можете сделать это после разделения данных профиля в другой таблице базы данных (что является распространенным подходом. а также сохранить данные вашего профиля в другой таблице и связать ее с таблицей пользователей по умолчанию с помощью ключа GUID пользователя), тогда вы можете использовать LINQ для запроса данных профилей пользователей.
подумайте об использовании чего-то вроде этого:
matches =
matches.Union(
memberDB.aspnet_Profile
.Where("it.PropertyValuesString Like @first",
new ObjectParameter("first", "%<FirstName>%" + firstName + "%</FirstName>%")
).Select(p => p.UserId));
Я должен, наверное, упомянуть, что мы создали файл edmx для нашей базы данных членства. Тем не менее, я бы подумал о переносе всей этой интересной информации в ее собственные таблицы в базе данных вашего приложения, когда у вас будет такая возможность.