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

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top