5

我有 Asp.net 配置文件属性 Profile.Location、Gender 等

我需要获取其位置属于“伦敦”且性别 = 男性的所有用户的列表

如何使用 LINQ 在 Asp.net Profile 上执行搜索

4

3 回答 3

2

事实上,你可以做到。但是你需要先做好几件事:

  1. 解析并返回序列化属性/值的函数
  2. (可选)为每个用户行调用函数的视图。这是可选的,因为某些 ORM 支持使用用户定义的函数组合查询。无论如何,我建议将视图放置到位。

这是我编写的一个 CLR 函数,它解析 aspnet_Profile 表中的 PropertyNames 和 PropertyValuesString 列值。它返回一个带有属性列和值列的表。

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
于 2012-12-06T16:02:41.310 回答
0

考虑使用这样的东西:

   matches = 
       matches.Union(
          memberDB.aspnet_Profile
          .Where("it.PropertyValuesString Like @first",
           new ObjectParameter("first", "%<FirstName>%" + firstName + "%</FirstName>%")
           ).Select(p => p.UserId));

我应该提到我们已经为我们的会员数据库创建了一个 edmx 文件。也就是说,如果有机会,我会考虑将所有这些有趣的信息移到应用程序数据库中它自己的表中。

于 2013-01-23T21:27:38.113 回答
0

不,您不能通过默认的 ASP.NET 配置文件提供程序(将配置文件数据保存在数据库中的单个字符串字段中)执行此操作,但在将配置文件数据分离到另一个数据库表中后您仍然可以执行此操作(这是一种常用方法以及将您的配置文件数据存储在另一个表中并通过用户 GUID 键将其与默认用户表连接),然后您可以使用 LINQ 查询您的用户配置文件数据。

于 2011-05-28T14:10:14.950 回答