相当于SQL IN子句

时间:2012-01-16 14:21:24

标签: linq dynamics-crm-2011 dynamics-crm crm microsoft-dynamics

我有一个名为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;

我理解为什么会抛出这个错误,但我想知道是否可以使用XRM进行IN子句的等效。

如果可能,那么如何让XRM执行SELECT * FROM new_trexmail WHERE new_contextline in ('aaa', 'hhh')

谢谢,

大卫

1 个答案:

答案 0 :(得分:5)

查看(超过期望的)list of LINQ limitations,特别是对where子句的限制:

  

子句的左侧必须是属性名称和右侧   该条款的一面必须是一个值。您不能将左侧设置为a   不变。该子句的两个边都不能是常量。支持   String函数包含,StartsWith,EndsWith和Equals。

因为test不是CRM属性,所以不能在其上调用Contains。但是,解决这个问题的一种方法是使用ScottGu开发的“Dynamic Linq”,如下所示:

//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;