【问题标题】:LINQ for CRM how to use C# list in where clauseLINQ for CRM 如何在 where 子句中使用 C# 列表
【发布时间】:2018-12-07 03:30:26
【问题描述】:

我需要在 LINQ where 子句中使用 C# 列表。我可以在 where 子句中使用一个值进行查询,请指导如何在 LINQ 查询中使用 C# 列表。

下面是我的代码:

var usersList= new List<string>();

usersList.Add("User1");
usersList.Add("User2");

(from u in UserSet
where u.FullName.Equals("any user from usersList")
select u.FullName).Take(3).Dump();

基本上如何告诉 LINQ 检查usersList 中的每个值

编辑: 我正在为 CRM 做这个 LINQ

谢谢

【问题讨论】:

标签: c# .net linq dynamics-crm linqpad


【解决方案1】:

你可以使用Contains

var usersList= new List<string>();
usersList.Add("User1");
usersList.Add("User2");

...

(from u in UserSet
where usersList.Contains(u.FullName)
select u.FullName).Take(3)

Enumerable.Contains Method (IEnumerable, TSource)

通过使用判断一个序列是否包含指定的元素 默认的相等比较器。

更新

我看不到将包​​含与内存列表一起使用的方法。但是,如果用户列表不是太大,您可以在内存中执行此操作

var results  = (from u in UserSet
               select u.FullName);

var results (from r in results
             where usersList.Contains(r)
             select r).Take(3);

但必须有更好的方法。

【讨论】:

  • TheGeneral,很抱歉我没有提到在 LINQ for CRM 中使用它。尝试并得到错误 NotSupportedException: Invalid 'where' 条件。实体成员正在调用无效的属性或方法。
  • @user576510 已更新,这可能不是最好的方法,但它应该可以工作,对于小列表,我一直在努力寻找更好的解决方案
【解决方案2】:

您不能将 Contains 方法与 LINQ for Dynamics CRM 一起使用。 一般是正确的,您可以将整个实体集放入内存,然后执行您的 contains 方法。然而,这是低效的——尤其是当系统上线后实体集增加时。

我假设您正在使用早期绑定上下文,这就是您要使用 LINQ 的原因,如果这是正确的,那么可以选择执行以下操作:

var usersList= new [] {
 "User1",
 "User2"
};

var systemUserQuery = new QueryExpression{
    EntityName = SystemUser.EntityLogicalName,
    ColumnSet = new ColumnSet("fullname","domainname" ....), //explicitly retrieve attributes
    Criteria = {
        Conditions = {
            new ConditionExpression("fullname", ConditionOperator.In, userList)
        }
    }
};

var usersResponse = organizationService.RetrieveMultiple(systemUserQuery); 
var systemUsers = usersResponse.Entities.Select(s => (SystemUser)s).ToArray();

这不会在表达式中使用 LINQ 来检索数据,但是查询是远程执行的,您不需要检索整个实体集。在语句var systemUsers = usersResponse.Entities.Select(s =&gt; (SystemUser)s).ToArray(); 中,对象类型Microsoft.Xrm.Sdk.Entity 将被转换为Early Bound 类型SystemUser,并且您可以像任何其他Early Bound 对象一样继续使用这些对象。

使用ConditionOperator.In 运算符时,提供的值需要是一个数组。您可以将userList 变量声明为List&lt;string&gt;,如您的示例中所示。但是,您需要在将对象添加到查询之前对其进行转换。

请注意ColumnSet = new ColumnSet("fullname","domainname" ....) 行是您选择要在请求中检索的属性的位置。如果您没有在此处指定属性,则该属性将是强制转换后的默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多