LINQ to Dynamics CRM查询本地过滤记录

我使用CRM 2011 RC(v5)LINQ-to-CRM提供程序编写了一个Linq to CRM查询。 我有一个本地声明的List ,我想加入CRM实体,我希望查询在CRM服务器上执行。 一个例子可能有帮助:

MyObject myObject = new MyObject(); List myAccountsList = new List(); myAccountsList.Add(new myAccount() {AccountNumber = "123"}; myAccountsList.Add(new myAccount() {AccountNumber = "456"}; myObject.ListOfAccounts = myAccountsList; var accountsQuery = from ax in myObject.ListOfAccounts join a in orgContext.CreateQuery() on ax.AccountNumber equals a.account_number select a; foreach(var item in accountsQuery) { Console.WriteLine("Id of record retrieved: " + a.Id.ToString()); } 

上面的代码编译并执行,但是,在检索整个CRM实体记录集之后,本地执行记录的过滤。 显然,当CRM实体包含数千行时,查询将执行得很差甚至超时。

我已经阅读了有关IQueryable和IEnumerable的内容,并尝试使用AsQueryable()扩展方法转换List,该方法没有任何效果。 我需要上面的Linq查询来运行SQL,如下所示:

 SELECT a.* FROM customAccountEntity AS a WHERE a.account_number IN ('123', '456'); 

如果想要加入多个字段,请使用临时表。 我怎么能做到这一点?

经过大量的敲击和研究后,我通过使用Predicate Builder和LINQKit解决了这个问题。 我需要使用本地List 中的创建一个基于Or的谓词,然后将谓词传递给Where LINQ扩展方法。 重要的是,我需要调用LINQKit公开的AsExpandable扩展方法。 所以我的代码看起来像这样:

 var predicate = PredicateBuilder.False(); // Loop through the local List creating an Or based predicate foreach (var item in myAccountsList) { string temp = item.AccountNumber; predicate = predicate.Or (x => x.customCrmEntityAttribute == temp); } // The variable predicate is of type Expression> var myLinqToCrmQuery = from ax in myObject.ListOfAccounts from cx in orgContext.CreateQuery().AsExpandable().Where(predicate) where ax.AccountNumber == cx.account_number select cx; foreach (resultItem in myLinqToCrmQuery) { Console.WriteLine("Account Id: " + resultItem.Id); } 

上面的代码将在CRM服务器上运行SQL语句,如下所示:

 SELECT a.* FROM customAccountEntity AS a WHERE a.account_number = '123' OR a.account_number = '456' 

这意味着我可以在运行时创建一个动态where子句,并知道我的查询将在CRM SQL Server上运行过滤逻辑。 希望这有助于其他人。

您可以简单地使用连接表达式进行过滤,而不是使用谓词。

 var myLinqToCrmQuery = from ax in myObject.ListOfAccounts join cx in orgContext.CreateQuery on ax.AccountNumber equals cx.account_number select cx; 

干杯,卢卡斯

编辑:尝试那个:

 MyObject myObject = new MyObject(); List myAccountsList = new List(); myAccountsList.Add(new myAccount() {AccountNumber = "123"}; myAccountsList.Add(new myAccount() {AccountNumber = "456"}; myObject.ListOfAccounts = myAccountsList; var accountNumbers = myObject.ListOfAccounts.Select(a => a.AccountNumber); var accountsQuery = orgContext.CreateQuery() .Where(a => accountNumbers.Contains(a.account_number)); foreach(var item in accountsQuery) { Console.WriteLine("Id of record retrieved: " + a.Id.ToString()); } 

编辑:如果查询提供程序不支持包含,使用多个OR构建Where条件,则可以使用谓词构建器使其变得容易