असल में, आप इसे कर सकते हैं। लेकिन अगर आप पहली जगह में चीजों के एक जोड़े रखना होगा:
- एक समारोह है कि पार्स करके धारावाहिक संपत्ति रिटर्न/महत्व देता
- वैकल्पिक रूप से, एक दृश्य के प्रत्येक उपयोगकर्ता पंक्ति के लिए फ़ंक्शन को कॉल। यह वैकल्पिक है क्योंकि उपयोगकर्ता द्वारा परिभाषित कार्यों के साथ कुछ ओआरएम का समर्थन प्रश्न पूछना। मैं वैसे भी दृश्य को जगह में रखने की सलाह देता हूं।
यहां एक सीएलआर फ़ंक्शन है जिसे मैंने लिखा है कि एस्पनेट_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
वोला, आप एसक्यूएल या अपनी पसंद के ओआरएम के साथ दृश्य पूछ सकते हैं।
from u in UsersView
where u.LastName.StartsWith("ove")
select u
स्रोत
2012-12-06 16:02:41
मुझे प्रोफ़ाइल फ़ील्ड के आधार पर खोज और फ़िल्टर करने की आवश्यकता है। लेकिन सभी मान एस्पनेट_Profile तालिका पर एक स्ट्रिंग में संग्रहीत हैं। और aspnet_profile तालिका से पूछताछ करने की सलाह नहीं दी जाती है। मैं प्रोफाइलइंजर का संग्रह प्राप्त करने के लिए ProfileManager.GetAllProfiles() का उपयोग कर सकता हूं। और मूल रूप से LINQ – Bitlancer
का उपयोग करके फ़िल्टर करने का प्रयास कर रहे हैं क्या आप GetAllProfiles संग्रह के विरुद्ध linq क्वेरी करने में असमर्थ हैं? यदि ऐसा है तो http://programmersunlimited.wordpress.com/2011/01/08/linqqer-exposing-linq-extensions-on-non-ienumerableiqueriable-collections/ MSDN पर देखकर यह वापसी प्रकार System.Web.Profile दिखाता है .ProfileInfoCollection आईसीओलेक्शन है, आईनेमरेबल जिसका मतलब है कि आपको उस पर लिंक नहीं मिलेगा। लिंक कार्यक्षमता प्राप्त करने के लिए लिंक से कोड का उपयोग करें। –
प्रोफाइलइन्फो ऑब्जेक्ट में केवल उपयोगकर्ता नाम या LastActivityDate जैसी बहुत ही बुनियादी जानकारी होती है, इसमें web.config में परिभाषित कस्टम फ़ील्ड शामिल नहीं होते हैं। तो यदि संग्रह पर लिंक उपलब्ध कराया गया है, तो यह आपको अपने कस्टम फ़ील्ड पर फ़िल्टर करने की अनुमति नहीं देगा। आपको एक विधि की आवश्यकता है जो प्रोफाइलबेस ऑब्जेक्ट संग्रह देता है, और प्रदान की गई कोई भी विधि इसे अनुमति नहीं देती है। –