5

Asp.netプロファイルプロパティProfile.Location、Genderなどがあります

場所が「ロンドン」に属し、性別=男性であるすべてのユーザーのリストを取得する必要があります

LINQを使用してAsp.netプロファイルで検索を実行するにはどうすればよいですか

4

3 に答える 3

2

実際、あなたはそれを行うことができます。ただし、最初にいくつかのことを行う必要があります。

  1. シリアル化されたプロパティ/値を解析して返す関数
  2. オプションで、ユーザー行ごとに関数を呼び出すビュー。一部の ORM はユーザー定義関数を使用したクエリの作成をサポートしているため、これはオプションです。とにかくビューを配置することをお勧めします。

aspnet_Profile テーブルの PropertyNames 列と PropertyValuesString 列の値を解析する、私が作成した CLR 関数を次に示します。プロパティ列と値列を含むテーブルを返します。

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

いいえ、既定の ASP.NET プロファイル プロバイダー (データベース内の単一の文字列フィールドにプロファイル データを保存する) を介してこれを行うことはできませんが、プロファイル データを別のデータベース テーブルに分離した後でもこれを行うことができます (これは一般的な方法です)。プロファイル データを別のテーブルに格納し、ユーザー GUID キーを介して既定のユーザー テーブルに接続する場合)、LINQ を使用してユーザー プロファイル データをクエリできます。

于 2011-05-28T14:10:14.950 に答える
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 に答える