2010-03-21 12 views
7

Tôi muốn biết làm thế nào để có thể làm cho một cây biểu thức bằng cách nhập nhiều hơn một tham sốNhiều điều kiện trong Lambda Expressions trong thời gian chạy C#

Ví dụ:

dataContext.Users.Where(u => u.username == "Username" && u.password == "Password") 

Tại thời điểm mã mà tôi đã làm được những điều sau nhưng muốn thực hiện tổng quát hơn trong trường hợp cho dù tình trạng này là OR hoặc AND

public Func<TLinqEntity, bool> ANDOnlyParams(string[] paramNames, object[] values) 
    { 
     List<ParameterExpression> paramList = new List<ParameterExpression>(); 
     foreach (string param in paramNames) 
     { 
      paramList.Add(Expression.Parameter(typeof(TLinqEntity), param)); 
     } 

     List<LambdaExpression> lexList = new List<LambdaExpression>(); 
     for (int i = 0; i < paramNames.Length; i++) 
     { 
      if (i == 0) 
      { 
       Expression bodyInner = Expression.Equal(
            Expression.Property(
             paramList[i], paramNames[i]), 
             Expression.Constant(values[i])); 
       lexList.Add(Expression.Lambda(bodyInner, paramList[i])); 
      } 
      else 
      { 
       Expression bodyOuter = Expression.And(
            Expression.Equal(
            Expression.Property(
            paramList[i], paramNames[i]), 
            Expression.Constant(values[i])), 
            Expression.Invoke(lexList[i - 1], paramList[i])); 
       lexList.Add(Expression.Lambda(bodyOuter, paramList[i])); 
      } 
     } 

     return ((Expression<Func<TLinqEntity, bool>>)lexList[lexList.Count - 1]).Compile(); 
    } 

Cảm ơn

Trả lời

2

Expression.And là điều sai để sử dụng ở đây, đó là bitwise và. Bạn muốn AndAlso.

Dường như bạn ngoài việc bạn đã biết cơ chế về cách xây dựng cây biểu thức. Vì vậy, những gì bạn đang thực sự yêu cầu là làm thế nào bạn có thể cho phép người gọi phương pháp xây dựng của bạn chỉ định một cách phức tạp, linh hoạt hơn trong việc kết hợp các điều kiện khác nhau.

Cuối cùng cho sự linh hoạt thực sự, bạn cần một ngôn ngữ truy vấn nhỏ. Phân tích cú pháp ngôn ngữ để xây dựng cây biểu thức.

Trong ngắn hạn, bạn có thể nhận được một cái gì đó đơn giản hơn nhiều: một danh sách các biểu thức nguyên thủy và cờ bool để nói liệu chúng có nên được kết hợp với & & hoặc ||.

Cập nhật - Tôi nhận thấy bạn đang thực sự biên dịch biểu thức kết quả thành một đại biểu thực sự. Điều này làm cho tôi tự hỏi tại sao bạn đang làm điều này một cách khó khăn ngay từ đầu. Tại sao không chỉ viết biểu thức như một lambda, như trong ví dụ ban đầu của bạn? (Nếu bạn đang sử dụng LINQ to SQL hoặc EF, bạn cũng không nên biên dịch biểu thức.)

Cập nhật 2 - Những gì bạn có thể cần là Dynamic Linq.

+0

Về lý do tại sao tôi đang đi với một cách khó khăn (trả lại một đại biểu), lý do là không có quyền truy cập trực tiếp vào tên cột cơ sở dữ liệu tại thời điểm thiết kế. Và tôi không thể truy cập bằng cách sử dụng datacontext.table.Where (...); bởi vì tôi có tên bảng được mã hóa bên trong cơ sở dữ liệu. Cảm ơn câu trả lời của bạn Tôi sẽ tìm phương pháp AndAlso ... – Ryan

+0

@Ryan - xem cập nhật - Tôi nhớ thư viện thực hiện việc này! –

+0

Cảm ơn Daniel ... Tôi thực sự đánh giá cao nó trông giống như chính xác những gì tôi cần :) – Ryan

Các vấn đề liên quan