2012-01-16 21 views
7

Tôi có một thực thể gọi là new_trexmail với một thuộc tính chuỗi gọi là new_contextline.Tương đương với mệnh đề SQL IN

Tôi đang cố gắng lấy danh sách các thực thể có new_contextlineis trong danh sách được xác định.

Các mã sau thất bại với lỗi: NotSupportedException: Invalid 'where' condition. An entity member is invoking an invalid property or method.

string[] test = new[]{"aaa", "hhh"}; 

var query = from n in New_trexmailSet 
      where test.Contains(n.New_contextline) 
      select n; 

Tôi hiểu tại sao lỗi này đang được ném nhưng tôi tự hỏi nếu nó có thể làm equiavalent của một điều khoản trong việc sử dụng XRM.

Nếu có thể thì làm cách nào để chuyển XRM thành thực thi SELECT * FROM new_trexmail WHERE new_contextline in ('aaa', 'hhh')?

Cảm ơn,

David

Trả lời

5

Kiểm tra ra (dài hơn mong muốn) list of LINQ limitations, đặc biệt là giới hạn về where khoản:

Phía bên trái của mệnh đề phải là một tên thuộc tính và bên phải của mệnh đề phải là một giá trị. Bạn không thể đặt bên trái thành hằng số . Cả hai mặt của mệnh đề không thể là hằng số. Hỗ trợ các hàm String Chứa, StartsWith, EndsWith và Equals.

Vì vậy, kể từ test không phải là thuộc tính CRM, bạn không thể gọi Contains trên đó. Tuy nhiên, một trong những con đường xung quanh này là sử dụng "Dynamic Linq" như phát triển bởi ScottGu và như chứng minh dưới đây:

//must include the below using statements 
//using System.Linq; 
//using System.Linq.Dynamic; 

var trexmailSet = New_trexmailSet; 

string[] test = new[] { "aaa", "hhh" }; 

string whereClause = ""; 

foreach (string name in test) 
{ 
    whereClause += string.Format("new_contextline = \"{0}\" OR ", name); 
} 

trexmailSet = trexmailSet.Where(whereClause.Substring(0, whereClause.Length - 4)); 

var query = from n in trexmailSet 
      select n; 
+0

Đó không được công việc! Tôi đã không nhận thức được rằng thư viện, nó trông khá hữu ích. Cảm ơn rất nhiều. – dlarkin77