2011-05-26 14 views
5

का उपयोग कर प्रॉपर्टी से प्राप्त क्वेरी मैं Asp.net प्रोफ़ाइल संपत्ति Profile.Location, लिंग आदिकैसे Asp.Net प्रोफ़ाइल LINQ

मैं सभी उपयोगकर्ताओं जिसका स्थान अंतर्गत आता है करने के लिए "लंदन" और लिंग की सूची प्राप्त करने की जरूरत है = पुरुष है

मैं LINQ

+0

मुझे प्रोफ़ाइल फ़ील्ड के आधार पर खोज और फ़िल्टर करने की आवश्यकता है। लेकिन सभी मान एस्पनेट_Profile तालिका पर एक स्ट्रिंग में संग्रहीत हैं। और aspnet_profile तालिका से पूछताछ करने की सलाह नहीं दी जाती है। मैं प्रोफाइलइंजर का संग्रह प्राप्त करने के लिए ProfileManager.GetAllProfiles() का उपयोग कर सकता हूं। और मूल रूप से LINQ – Bitlancer

+1

का उपयोग करके फ़िल्टर करने का प्रयास कर रहे हैं क्या आप GetAllProfiles संग्रह के विरुद्ध linq क्वेरी करने में असमर्थ हैं? यदि ऐसा है तो http://programmersunlimited.wordpress.com/2011/01/08/linqqer-exposing-linq-extensions-on-non-ienumerableiqueriable-collections/ MSDN पर देखकर यह वापसी प्रकार System.Web.Profile दिखाता है .ProfileInfoCollection आईसीओलेक्शन है, आईनेमरेबल जिसका मतलब है कि आपको उस पर लिंक नहीं मिलेगा। लिंक कार्यक्षमता प्राप्त करने के लिए लिंक से कोड का उपयोग करें। –

+0

प्रोफाइलइन्फो ऑब्जेक्ट में केवल उपयोगकर्ता नाम या LastActivityDate जैसी बहुत ही बुनियादी जानकारी होती है, इसमें web.config में परिभाषित कस्टम फ़ील्ड शामिल नहीं होते हैं। तो यदि संग्रह पर लिंक उपलब्ध कराया गया है, तो यह आपको अपने कस्टम फ़ील्ड पर फ़िल्टर करने की अनुमति नहीं देगा। आपको एक विधि की आवश्यकता है जो प्रोफाइलबेस ऑब्जेक्ट संग्रह देता है, और प्रदान की गई कोई भी विधि इसे अनुमति नहीं देती है। –

उत्तर

0

नहीं का उपयोग कर Asp.net प्रोफाइल पर एक खोज कैसे करते हैं, तो आप डिफ़ॉल्ट ASP.NET प्रोफ़ाइल प्रदाता (जो डेटाबेस में एक भी स्ट्रिंग क्षेत्र में प्रोफ़ाइल डेटा बचाता है के माध्यम से ऐसा नहीं कर सकते) हालांकि आप अभी भी किसी अन्य डेटाबेस तालिका में प्रोफ़ाइल डेटा को अलग करने के बाद ऐसा कर सकते हैं (जो एक आम दृष्टिकोण है और साथ ही साथ अपने प्रोफाइल डेटा को किसी अन्य टी में स्टोर करना है सक्षम और उपयोगकर्ता GUID कुंजी के माध्यम से डिफ़ॉल्ट उपयोगकर्ता तालिका के साथ तार), तो आप अपने उपयोगकर्ता प्रोफाइल डेटा पूछने के लिए LINQ का उपयोग कर सकते हैं।

2

असल में, आप इसे कर सकते हैं। लेकिन अगर आप पहली जगह में चीजों के एक जोड़े रखना होगा:

  1. एक समारोह है कि पार्स करके धारावाहिक संपत्ति रिटर्न/महत्व देता
  2. वैकल्पिक रूप से, एक दृश्य के प्रत्येक उपयोगकर्ता पंक्ति के लिए फ़ंक्शन को कॉल। यह वैकल्पिक है क्योंकि उपयोगकर्ता द्वारा परिभाषित कार्यों के साथ कुछ ओआरएम का समर्थन प्रश्न पूछना। मैं वैसे भी दृश्य को जगह में रखने की सलाह देता हूं।

यहां एक सीएलआर फ़ंक्शन है जिसे मैंने लिखा है कि एस्पनेट_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 
+0

मैं +1 देता हूं, मुझे लिंक और रेगेक्स की शक्ति पसंद है जिसे आपने ParseProfileString() फ़ंक्शन में उपयोग किया था। – bau

+0

धन्यवाद, @ बाउ।मुझे अनुक्रमों और कार्यों में सोचना पसंद है, इसलिए मेरा कोड इस समय की तरह दिखता है। –

0

कुछ इस तरह उपयोग करने पर विचार:

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

मैं शायद हम अपने सदस्यता डेटाबेस के लिए एक edmx फ़ाइल बना लिया है कि उल्लेख करना चाहिए मैं LINQPad में यह एक में लिखा था। उस ने कहा, जब आप मौका प्राप्त करते हैं, तो मैं उस सभी रोचक जानकारी को अपने एप्लिकेशन डेटाबेस में अपनी टेबल में ले जाने पर विचार करता हूं।

संबंधित मुद्दे