Pregunta

Tengo una entidad llamada new_trexmail con un atributo de cadena llamado new_contextline.

Estoy tratando de obtener una lista de entidades donde New_ContextLineis en una lista definida.

El siguiente código falla con el error: 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;

Entiendo por qué se está lanzando este error, pero me pregunto si es posible hacer el equiavalente de una cláusula en Usando XRM.

Si es posible, ¿cómo hago para que XRM ejecute SELECT * FROM new_trexmail WHERE new_contextline in ('aaa', 'hhh')?

Gracias,

David

¿Fue útil?

Solución

Echa un vistazo al (más largo de lo deseado) Lista de limitaciones de Linq, particularmente la limitación del where cláusula:

El lado izquierdo de la cláusula debe ser un nombre de atributo y el lado derecho de la cláusula debe ser un valor. No puede configurar el lado izquierdo en una constante. Ambos lados de la cláusula no pueden ser constantes. Admite las funciones de cadena contiene, comienza, finales y iguales.

Entonces, ya que test no es un atributo CRM, no puedes llamar Contains en eso. Sin embargo, una forma en torno a esto es usar "Linq dinámico"Según lo desarrollado por Scottgu y como se demuestra a continuación:

//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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top