开发者

Build dynamic LINQ?

开发者 https://www.devze.com 2022-12-24 05:58 出处:网络
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)

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 dynamically?

Thanks

DD

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
        && c开发者_运维问答s.adviser == dlAdviser.Text
    select new
    {
        Ref = cs.ref_no,
        ClaimType = cl.claim_type,
        ClaimStatus = cl.claim_status,
        AppealDate = cl.appeal_date
    };

gvReport.DataSource = query;


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.


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


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.


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

精彩评论

暂无评论...
验证码 换一张
取 消