2010-03-22 16 views
5

मैं डेटा क्वेरी करने के लिए LINQ का उपयोग कर रहा हूं। ऐसे मामले पर विचार करें जहां उपयोगकर्ता केवल 3 फ़ील्ड में से 1 पर रिपोर्ट करना चाहता है? (नीचे देखें)गतिशील LINQ बनाएँ?

क्या कोई मुझे बता सकता है कि क्वेरी को गतिशील रूप से कैसे बनाया जाए?

धन्यवाद

डीडी

var query = 
    from cl in db.tblClaims 
    join cs in db.tblCases 
     on cl.ref_no equals cs.ref_no 
    where cl.claim_status == "Appeal" 
     && cl.appeal_date >= Convert.ToDateTime(txtReferedFromDate.Text) 
     && cl.appeal_date <= Convert.ToDateTime(txtReferedToDate.Text) 
     && cs.referred_from_lho == dlLHO.Text 
     && cs.adviser == dlAdviser.Text 
    select new 
    { 
     Ref = cs.ref_no, 
     ClaimType = cl.claim_type, 
     ClaimStatus = cl.claim_status, 
     AppealDate = cl.appeal_date 
    }; 

gvReport.DataSource = query; 

उत्तर

5

आप कुछ इस तरह कर सकता है:

var query = from cl in db.tblClaims 
         join cs in db.tblCases 
          on cl.ref_no equals cs.ref_no 
         where cl.claim_status == "Appeal" 
         select new 
         { 
          Ref = cs.ref_no, 
          ClaimType = cl.claim_type, 
          ClaimStatus = cl.claim_status, 
          AppealDate = cl.appeal_date, 
          cs.referred_from_lho, 
          cs.adviser 
         }; 

if(!string.IsNullOrEmpty(txtReferedFromDate.Text) 
    && !string.IsNullOrEmpty(txtReferedToDate.Text)) 
    query = query.Where(cl => 
        cl.appeal_date >= Convert.ToDateTime(txtReferedFromDate.Text) 
       && cl.appeal_date <= Convert.ToDateTime(txtReferedToDate.Text)); 

if(!string.IsNullOrEmpty(dlLHO.Text)) 
    query = query.Where(cl => cl.referred_from_lho == dlLHO.Text); 

if(!string.IsNullOrEmpty(dlAdviser.Text)) 
    query = query.Where(cl => cl.adviser == dlAdviser.Text); 

gvReport.DataSource = 
     query.Select(o => new { o.Ref, o.ClaimType, o.ClaimStatus, o.AppealDate }); 

यह केवल उन क्षेत्रों फिल्टर रूप में यदि वे पर फिल्टर करने के लिए मूल्यों था, अन्यथा वे क्वेरी में उपयोग नहीं किया जाएगा का प्रयोग करेंगे।

+0

सहायता के लिए धन्यवाद, और लाइब्रेरी के लिंक के लिए भी धन्यवाद, सराहना की – DarkW1nter

5

हम इसे एक मानदंड वस्तु में गुजर और फिर अभिव्यक्ति के पेड़ का उपयोग कर वांछित मापदंड जोड़कर क्वेरी बनाने से है।

IQueryable<Data.Story> query = ctx.DataContext.Stories; 

if (criteria.StoryId != null) // StoryId 
    query = query.Where(row => row.StoryId == criteria.StoryId); 

if (criteria.CustomerId != null) // CustomerId 
    query = query.Where(row => row.Project.CustomerId == criteria.CustomerId); 

if (criteria.SortBy != null) // SortBy 
    query = query.OrderBy(criteria.SortBy + " " + criteria.SortOrder.Value.ToStringForSql()); 

if (criteria.MaximumRecords != null) // MaximumRecords 
    query = query.Take(criteria.MaximumRecords.Value); 

var data = query.Select(row => StoryInfo.FetchStoryInfo(row)); 

तुम भी http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+0

सच पूछिये तो, आप एक वास्तविक गतिशील रूप से परिभाषित अभिव्यक्ति यहाँ उपयोग नहीं कर रहे हैं, लेकिन यह फिर भी सही समाधान है। –

+0

@ एडम रॉबिन्सन अच्छा बिंदु ... मैं वास्तव में कुछ "गतिशील" करने के विरोध में "संलग्न" द्वारा क्वेरी बना रहा हूं। स्पष्टीकरण के लिए धन्यवाद! – mattruma

1

माइक्रोसॉफ्ट पर गतिशील Linq पुस्तकालय पर एक नज़र ले जा सकते हैं एक उदाहरण के पुस्तकालय (Linq गतिशील पुस्तकालय) है कि आप Linq में गतिशील querys के निर्माण के लिए अनुमति देता है पैदा कर दी है, आप कैसे करने के लिए देख सकते हैं इसका उपयोग करें और इसे इस लिंक से डाउनलोड करें: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

कहा जा रहा है कि आप अपने कोड की शुरुआत में एक IQueriable घोषित कर सकते हैं और पैरामीटर के आधार पर क्लॉज कहां जोड़ सकते हैं। मैं एक उदाहरण लिखने जा रहा था, लेकिन मैट्रूमा ने मुझे इसे हराया :)

मैं दूसरा विकल्प पसंद करता हूं, लेकिन ऐसी स्थितियां हैं जहां डायनामिक लाइब्रेरी का उपयोग करना एक बेहतर समाधान है।

0

इस तरह:

namespace overflow4 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var orig = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; 

      var newlist = FilterNumbers(orig, true, false, false); 

      foreach (int x in newlist) 
       Console.WriteLine(x); 
      Console.ReadLine(); 
     } 

     private static IEnumerable<int> FilterNumbers(
      List<int> origlist, 
      bool wantMultiplesOf2, 
      bool wantMultiplesOf3, 
      bool wantMultiplesOf5) 
     { 
      IEnumerable<int> sofar = origlist; 

      if (wantMultiplesOf2) 
       sofar = sofar.Where(n => n % 2 == 0); 

      if (wantMultiplesOf3) 
       sofar = sofar.Where(n => n % 3 == 0); 

      if (wantMultiplesOf5) 
       sofar = sofar.Where(n => n % 5 == 0); 

      return sofar; 
     } 
    } 
} 
संबंधित मुद्दे