7

У меня есть объект с именем new_trexmail с атрибутом string, называемым new_contextline.Эквивалентно предложению SQL IN

Я пытаюсь получить список сущностей, где new_contextlineis в определенном списке.

Следующий код завершается с ошибкой: 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; 

Я понимаю, почему эта ошибка быть выброшен, но мне интересно, если это возможно сделать equiavalent клаузулы IN с использованием XRM.

Если возможно, то как мне пойти на получение XRM для выполнения SELECT * FROM new_trexmail WHERE new_contextline in ('aaa', 'hhh')?

Спасибо,

Дэвид

ответ

5

ЗАКАНЧИВАТЬ (больше, чем хотелось бы) list of LINQ limitations, в частности, ограничение на where пункта:

Левая сторона пункта должно быть имя атрибута и правая сторона предложения должна быть значением. Вы не можете установить левую сторону в константу . Обе стороны предложения не могут быть константами. Поддерживает Функции String Содержит, StartsWith, EndsWith и Equals.

Так с test не атрибут CRM, вы не можете назвать Contains на нем. Тем не менее, один из способов обойти это использовать «Dynamic Linq», разработанной ScottGu и, как показано ниже:

//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

Это делает работу! Я не знал об этой библиотеке, это выглядит очень полезно. Огромное спасибо. – dlarkin77