2012-01-16 15 views
7

Tengo una entidad llamada new_trexmail con un atributo de cadena denominado new_contextline.Equivalente a la cláusula SQL IN

Estoy tratando de obtener una lista de entidades donde new_contextlineis está 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 lo equiavalent de una cláusula IN usando XRM.

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

Gracias,

David

Respuesta

5

Mira la (tiempo de lo deseado) list of LINQ limitations, en particular la limitación de la 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 como una constante . Ambos lados de la cláusula no pueden ser constantes. Admite las funciones de cadena Contiene, Comienza con, Finaliza e Igual.

Así que desde test no es un atributo de CRM, no se puede llamar Contains en él. Sin embargo, una forma de evitar esto es usar "Dynamic Linq" 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; 
+0

que hace el trabajo! No estaba al tanto de esa biblioteca, parece bastante útil. Muchas gracias. – dlarkin77