代码之家  ›  专栏  ›  技术社区  ›  Leon Barkan

Linq where表达式作为要添加的值

  •  0
  • Leon Barkan  · 技术社区  · 7 年前

    我有一个关于格式化LINQ查询的问题

    例如:

    var result = context.table.Include(x => x.table2).Where(q => q1);
    

    查询是相同的,但在不同的情况下,我有不同的where表达式,如q1、q2、q3

    var q1 = (q => q.x == "something");
    var q2 = (q => q.x == "something2");
    var q3 = (q => q.x == "something3");
    
    var qx;
    if(x)
    {
        qx = q1;
    }
    if(y)
    {
        qx = q2;
    }
    
    var result = context.table.Include(x => x.table2).Where(q => qx);
    
    4 回复  |  直到 7 年前
        1
  •  0
  •   Tsahi Asher    7 年前

    不完全是。你需要做些

    var result = context.table.Include(x => x.table2).Where(qx);
    

    因为 q1 , q2 等已经是与 .Where()

        2
  •  0
  •   mshwf    7 年前

    IQueryable.Where 接受 Expression<Func<TSource, bool>> ,你可以这样做:

    Expression<Func<SourceType, bool>> qx = q => false;
    Expression<Func<SourceType, bool>> q1 = q => q.x == "something";
    
        3
  •  0
  •   Daniel Loudon    7 年前

    在我回答之前请注意,你不能声明 qx 这样地:

    var qx;

    因为编译器不会立即解析类型。 如果你指定q的类型,你所要求的是可能的。

    Func<type, bool> q1 = (type q) => q.x == "something";
    Func<type, bool> q2 = (type q) => q.x == "something2";
    Func<type, bool> q3 = (type q) => q.x == "something3";
    
    Func<type, bool> qx = q3; //this needs a value (if x and y are false)
    if(x)
    {
       qx = q1;
    }
    if(y)
    {
       qx = q2;
    }
    
    var result = context.table.Include(x => x.table2).Where(qx);
    
        4
  •  -1
  •   MakePeaceGreatAgain    7 年前

    您似乎需要一个在运行时提供实际条件的查询。就用一个 Predicate

    Predicate<MyType> predicate;
    if(x)
    {
        predicate = q => q.x == "something";
    }
    else if(y)
    {
        predicate = q => q.x == "something2";
    }
    else
        predicate = q => q.x == "something3";
    var result = context.table.Include(x => x.table2).where(predicate);