c# - LINQ to Dynamics CRM 在本地查询过滤记录

标签 c# linq dynamics-crm dynamics-crm-2011

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

MyObject myObject = new MyObject();
List<myAccount> myAccountsList = new List<myAccount>();

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<customAccountEntity>() 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() 扩展方法转换列表,但没有效果。我需要上面的 Linq 查询来像这样运行 SQL:

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

如果想连接多个字段,则使用临时表。我怎样才能做到这一点?

最佳答案

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

var predicate = PredicateBuilder.False<customAccountEntity>();
// 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<Func<customAccountEntity, bool>>
var myLinqToCrmQuery =  from ax in myObject.ListOfAccounts
                        from cx in orgContext.CreateQuery<customAccountEntity>().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 上运行过滤逻辑。希望这对其他人有帮助。

关于c# - LINQ to Dynamics CRM 在本地查询过滤记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4943728/

相关文章:

javascript - 如何更新实体显示名称

c# - WCF REST 服务中的 CORS 支持

c# - DevExpress WaitForm 和 PreFilterMessage - 意外的 MouseMove 消息

c# - 长整数文字

c# - 帮助我理解 MY`Using` 和 `DataContext`

c# - Resharper:IEnumerable 的可能多重枚举

azure - 用于监控的遥测与组织洞察

c# - 如果在 ASP.NET 中不存在,sql server 的用法?

c# - 使用 LINQ 按类型合并序列

javascript - Dynamics crm 2016 - Web API 查询 - 动态值