2010-03-22 25 views
5

Tôi đang sử dụng LINQ để truy vấn dữ liệu. Hãy xem xét một trường hợp người dùng chỉ muốn báo cáo về nói 1 trong 3 trường? (xem bên dưới)Tạo LINQ động?

Bất kỳ ai có thể cho tôi biết cách tạo truy vấn động không?

Cảm ơn

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

Trả lời

5

Bạn có thể làm một cái gì đó như thế này:

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

này sẽ chỉ sử dụng những lĩnh vực như các bộ lọc nếu họ có giá trị để lọc trên, nếu không họ sẽ không được sử dụng trong truy vấn.

+0

cảm ơn sự giúp đỡ, và cảm ơn cho các liên kết đến thư viện là tốt, đánh giá cao – DarkW1nter

5

Chúng tôi làm điều đó bằng cách đi qua trong một đối tượng Tiêu chuẩn và sau đó xây dựng các truy vấn bằng cách thêm các tiêu chí mong muốn sử dụng cây biểu thức.

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

Bạn cũng có thể có một cái nhìn tại các thư viện động LINQ tại http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+0

Nói đúng ra, bạn không sử dụng một biểu hiện tự động xác định thực tế ở đây, nhưng đây là dù sao cũng là giải pháp đúng. –

+0

@Adam Robinson Điểm tốt ... Tôi thực sự đang xây dựng truy vấn bằng cách "chắp thêm" ... trái với việc làm bất cứ điều gì "động". Cảm ơn bạn đã làm rõ! – mattruma

1

Microsoft đã tạo ra một thư viện ví dụ (LINQ Thư viện động) cho phép bạn xây dựng querys năng động trong LINQ, bạn có thể tham khảo cách sử dụng nó và tải xuống từ liên kết này: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Điều đó đang được nói, bạn cũng có thể khai báo một điều khoản IQueriable khi bắt đầu mã và thêm điều khoản tùy thuộc vào thông số. Tôi sẽ viết một ví dụ, nhưng mattruma đánh tôi với nó :)

Tôi thích tùy chọn thứ hai, nhưng có những trường hợp sử dụng Thư viện động là giải pháp tốt hơn.

0

như thế này:

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; 
     } 
    } 
} 
Các vấn đề liên quan