Equivalente a SQL nella clausola
-
29-10-2019 - |
Domanda
Ho un'entità chiamata new_trexmail con un attributo stringa chiamato new_contextline.
Sto cercando di ottenere un elenco di entità in cui new_contextlineis in un elenco definito.
Il seguente codice fallisce con l'errore: 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;
Capisco perché questo errore viene lanciato, ma mi chiedo se sia possibile fare il equiavalente di una clausola in XRM.
Se è possibile, come posso eseguire XRM SELECT * FROM new_trexmail WHERE new_contextline in ('aaa', 'hhh')
?
Grazie,
David
Soluzione
Dai un'occhiata al (più lungo del desiderato) Elenco delle limitazioni LINQ, in particolare la limitazione del where
clausola:
Il lato sinistro della clausola deve essere un nome di attributo e il lato destro della clausola deve essere un valore. Non è possibile impostare il lato sinistro su una costante. Entrambi i lati della clausola non possono essere costanti. Supporta le funzioni di stringa contiene, startwith, endswith ed uguals.
Quindi da test
non è un attributo CRM, non puoi chiamare Contains
su di esso. Tuttavia, un modo per aggirare questo è usare "Linq dinamico"Come sviluppato da Scottgu e come dimostrato di seguito:
//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;