List<T> 是常量、表达式参数还是表达式树中的其他内容?

理查德77

假设我有这个 lambda 表达式,我想在上面写一个表达式树:

query.Where(d => (allCk && d.FacilityId == facilityId) //1.
      ||
     (!allCk && allSelected && d.FacilityId == facilityId  && !ids.Contains(d.Id)) //2.
      ||
     (!allCk && !allSelected && ids.Contains(d.Id))) //3.

这就是我设法编写它的方式:为简洁起见,我将只显示第二个条件,它是最复杂的(!allCk && allSelected && d.FacilityId == facilityId && !ids.Contains(d.Id)).

private Expression<Func<Documents, bool>> GetDocumentsPredicate(
        int facilityId, bool allCk, bool allSelected, List<int> ids)
{
  ParameterExpression pe = Expression.Parameter(typeof(Documents), "d");

  var listExpr1 = new List<Expression>();
  listExpr1.Add(Expression.IsFalse(Expression.Constant(allCk)));  //allCk
  listExpr1.Add(Expression.Constant(allSelected));                //allSelected

  var facilityParam = Expression.Constant(facilityId);            //facility
  Expression facilityIdProp = Expression.Property(pe, "FacilityId");
  Expression facilityIdEql = Expression.Equal(facilityIdProp, facilityParam);
  listExpr1.Add(facilityIdEql);

  //This is where I'm having trouble... Is ids a parameter or a constant???
  //Assuming it's a parameter...

  ParameterExpression peIds = Expression.Parameter(typeof(List<int>), "ids");
  Expression listContains = Expression.Call(
           pIds,
           typeof(List<int>).GetMethod("Contains"),
           Expression.Property(pe, "Id"));
  listExpr1.Add(Expression.Call(peIds, listContains, Expression.Property(pe, "Id"))); 
  var exp1 = listExpr1
             .Skip(1)
             .Aggregate(listExpr1[0], Expression.AndAlso);

  //...

}

我在这一行遇到错误:listExpr1.Add(Expression.Call(pIds, listContains, Expression.Property(pe, "Id")));// 无法将“Linq.Expression.ParameterExpression”转换为“System.Reflection.MethodInfo”。所以,它在抱怨pIds

那么这里的 ids 是什么,是常量、参数还是其他东西?

谢谢你的帮助

编辑

这就是我写整个方法的方式

private Expression<Func<Documents, bool>> GetDocumentsPredicate(
    int facilityId, bool allCk, bool allSelected, List<int> ids)
{
  ParameterExpression pe = Expression.Parameter(typeof(Document), "d");
  Expression constIds = Expression.Constant(ids);
  Expression allCkParam = Expression.Constant(allCk);
  Expression allSelectedParam = Expression.Constant(allSelected);

  Expression listContains = Expression.Call(
           constIds,
           typeof(List<int>).GetMethod("Contains"),
           Expression.Property(pe, "Id"));

  /*(allCk && d.FacilityId == facilityId) ==> exp0*/
  var facilityParam = Expression.Constant(facilityId);


  Expression facilityIdProp = Expression.Property(pe, "FacilityId");
  Expression facilityIdEql = Expression.Equal(facilityIdProp, facilityParam);

  Expression exp0 = Expression.AndAlso(allCkParam, facilityIdEql);

/*(!allCk && allSelected && d.FacilityId == facilityId && !ids.Contains(d.Id))) 
  ==> exp1 */
  var listExpr1 = new List<Expression>();
  listExpr1.Add(Expression.IsFalse(allCkParam));
  listExpr1.Add(allSelectedParam);
  listExpr1.Add(facilityIdEql);
  listExpr1.Add(Expression.IsFalse(listContains));

  var exp1 = listExpr1
            .Skip(1)
            .Aggregate(listExpr1[0], Expression.AndAlso);


   /* (!allCk && !allSelected && ids.Contains(d.Id)) ==> exp2 */
   var listExpr2 = new List<Expression>();
   listExpr2.Add(Expression.IsFalse(allCkParam));
   listExpr2.Add(Expression.IsFalse(allSelectedParam));
   listExpr1.Add(listContains);

   var exp2 = listExpr2
            .Skip(1)
            .Aggregate(listExpr2[0], Expression.AndAlso);

   var listExpr = new List<Expression> { exp0, exp1, exp2 };
   var exp = listExpr
            .Skip(1)
            .Aggregate(listExpr[0], Expression.OrElse);

    var expr = 
              Expression.Lambda<Func<Document, bool>>(exp, 
              new ParameterExpression[] { pe });
    return expr;
 }

这是我将鼠标悬停在返回值上时得到的结果

d => (((False AndAlso (d.FacilityId == 1)) 
     OrElse 
     (((IsFalse(False) AndAlso False) AndAlso (d.FacilityId == 1)) 
        AndAlso 
        IsFalse(value(System.Collections.Generic.List`1[System.Int32]).Contains(d.Id)))) 
     OrElse 
    ((IsFalse(False) AndAlso IsFalse(False)) 
        AndAlso 
        value(System.Collections.Generic.List`1[System.Int32]).Contains(d.Id)))

使用此语句进行的简单测试var count = query.Count();会产生异常:Unknown LINQ expression of type 'IsFalse'.

谢尔盖·卡利尼琴科

ids就表达式树而言,它不是参数,因为它没有传递给Func<...>. id您需要匹配s列表内置于表达式的结构中,因此Expression.Constant是处理它的正确方法。

然而,这还不是全部:因为ids是一个引用类型,所以只有对它的引用才会进入表达式的结构。因此,如果您在构造表达式后决定更改列表的内容,则 的含义ids.Contains将发生变化。

如果这不是您想要达到的效果,请复制该列表:

Expression constIds = Expression.Constant(ids.ToList());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

List<T> 上的动态表达式

来自分类Dev

使用List <T>为LINQ构建表达式树。包含方法

来自分类Dev

无法使用List <T>手动创建Lambda表达式树

来自分类Dev

当外键为空时,在具有Lambda表达式的List <T>中按Order By

来自分类Dev

Razor代码MVC 5中的Lambda表达式的ForEach循环5对于List <T>

来自分类Dev

子集合List <string> .Any的表达式树

来自分类Dev

如何使用表达式树编写 List All 方法?

来自分类Dev

Lambda表达式中的IN子句,以List为参考

来自分类Dev

遍历&&或||之间的每个参数 在Expressions <Func <T,Bool >> Lambda表达式中

来自分类Dev

T-SQL中的正则表达式

来自分类Dev

如何使用表达式树调用反射的Func <T,T>属性

来自分类Dev

使用其他表达式中的表达式评估树

来自分类Dev

如何为x => x.List创建简单的表达式树

来自分类Dev

如何为x => x.List创建简单的表达式树

来自分类Dev

表达式“ new T”的计算结果是右值还是左值?

来自分类Dev

表达式树中的可选参数

来自分类Dev

如何在对象的表达式中分配<T>的表达式?

来自分类Dev

表达式<Func <T,Boolean >> VS Func <T,Boolean>

来自分类Dev

正则表达式,带有用于list_blobs_with_prefix()的Prefix参数

来自分类Dev

具有StartsWith的List <string>的EF lambda表达式

来自分类Dev

使用正则表达式PHP构建UL LIST

来自分类Dev

以lambda表达式链语法联接List <Array>

来自分类Dev

如何在nHibernate Linq表达式中使用Nullable <T>参数?

来自分类Dev

定义lambda表达式时使用泛型类型参数<T>

来自分类Dev

定义lambda表达式时使用泛型类型参数<T>

来自分类Dev

T-SQL美元符号表达式

来自分类Dev

绑定类型为T &&的左值表达式

来自分类Dev

将表达式转换为Expression <Func <T,bool >>

来自分类Dev

T-SQL正则表达式替换

Related 相关文章

  1. 1

    List<T> 上的动态表达式

  2. 2

    使用List <T>为LINQ构建表达式树。包含方法

  3. 3

    无法使用List <T>手动创建Lambda表达式树

  4. 4

    当外键为空时,在具有Lambda表达式的List <T>中按Order By

  5. 5

    Razor代码MVC 5中的Lambda表达式的ForEach循环5对于List <T>

  6. 6

    子集合List <string> .Any的表达式树

  7. 7

    如何使用表达式树编写 List All 方法?

  8. 8

    Lambda表达式中的IN子句,以List为参考

  9. 9

    遍历&&或||之间的每个参数 在Expressions <Func <T,Bool >> Lambda表达式中

  10. 10

    T-SQL中的正则表达式

  11. 11

    如何使用表达式树调用反射的Func <T,T>属性

  12. 12

    使用其他表达式中的表达式评估树

  13. 13

    如何为x => x.List创建简单的表达式树

  14. 14

    如何为x => x.List创建简单的表达式树

  15. 15

    表达式“ new T”的计算结果是右值还是左值?

  16. 16

    表达式树中的可选参数

  17. 17

    如何在对象的表达式中分配<T>的表达式?

  18. 18

    表达式<Func <T,Boolean >> VS Func <T,Boolean>

  19. 19

    正则表达式,带有用于list_blobs_with_prefix()的Prefix参数

  20. 20

    具有StartsWith的List <string>的EF lambda表达式

  21. 21

    使用正则表达式PHP构建UL LIST

  22. 22

    以lambda表达式链语法联接List <Array>

  23. 23

    如何在nHibernate Linq表达式中使用Nullable <T>参数?

  24. 24

    定义lambda表达式时使用泛型类型参数<T>

  25. 25

    定义lambda表达式时使用泛型类型参数<T>

  26. 26

    T-SQL美元符号表达式

  27. 27

    绑定类型为T &&的左值表达式

  28. 28

    将表达式转换为Expression <Func <T,bool >>

  29. 29

    T-SQL正则表达式替换

热门标签

归档