Build dynamic LINQ?

前端 未结 4 1374
我寻月下人不归
我寻月下人不归 2020-12-21 00:45

I\'m using LINQ to query data. Consider a case where the user only wants to report on say 1 of the 3 fields? (see below)

Can anyone tell me how to build the query d

相关标签:
4条回答
  • 2020-12-21 01:21

    We do it by passing in a Criteria object and then build the query by appending the desired criteria using expression trees.

    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));
    

    You can also take a look at the Dynamic Linq library at http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    0 讨论(0)
  • 2020-12-21 01:29

    Microsoft has created an example library (Linq Dynamic Library) that allows you to construct dynamic querys in Linq, you can see how to use it and download it from this link: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    That being said, you can also declare an IQueriable at the begining of your code, and add where clauses depending on parameters. I was going to write an example, but mattruma beat me to it :)

    I prefer the second option, but there are situations where using the Dynamic Library is a better solution.

    0 讨论(0)
  • 2020-12-21 01:39

    You could do something like this:

    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 });
    

    This would only use those fields as filters if they had values to filter on, otherwise they wouldn't be used in the query.

    0 讨论(0)
  • 2020-12-21 01:42

    like this:

    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;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题