Эквивалентен предложению SQL IN - PullRequest
7 голосов
/ 16 января 2012

У меня есть объект с именем new_trexmail со строковым атрибутом с именем new_contextline.

Я пытаюсь получить список объектов, в которых new_contextline находится в определенном списке.

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

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

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

Спасибо,

Дэвид

1 Ответ

5 голосов
/ 16 января 2012

Ознакомьтесь с (длиннее, чем нужно) списком ограничений LINQ , в частности, ограничением в предложении where:

Левая сторона предложения должна бытьимя атрибута и правая часть предложения должны быть значениями.Вы не можете установить левую сторону на постоянную.Обе стороны пункта не могут быть постоянными.Поддерживает функции String Contains, 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;
...