2017-10-06 86 views
0

基于本地表达式变量可以加入两个from吗?加入两个表达式<func<>>

ex;

var query = from t in context.table1 
      from a in context.anothertable1.Where(x => t.id == a.id) 
      select new {a,t}; 

第2行,Where子句.Where(x => t.id == a.id)你会如何将它移动到表达式中?

我知道我可以做到这一点;

Expression<Func<anothertable1, bool>> test = x => x.field1 == 1; 

它会在这里工作;

var query = from t in context.table1 
      from a in context.anothertable1 
           .Where(x => t.id == a.id) 
           .Where(test) 
      select new {a,t}; 

和一切工作和生成的SQL查询是预期的。

我不知道如何做与其他where相同。

编辑

更复杂的例子,我匿名它,所以它可能无法编译

var listOfMinMaxtable1 = (from n in context.table1.Where(table1Filter) 
          group n by n.table1_Number into grp 
          select new MinMaxtable1() 
          { 
           table1_Id_Max = grp.Max(x => x.table1_Id), 
           table1_Id_Min = grp.Min(x => x.table1_Id), 
           table1_Number = grp.Key 
          }); 

var listtable2 = (from t in context.table2 
           group t by t.table2_Id into grp 
           select new table2() 
           { 
            table2 = grp, 
            table2_Id = grp.Key 
           }); 

var query = from MinMax in listOfMinMaxtable1 

       //inner join **reference 1**      
      from table3 in context.table3 
          .Where(x => x.table_Number == MinMax.table_Number) 
          .Where(noticeMasterFilter) //a working expression<func<>> 

       //inner join **reference 2** 
      from Lasttable1 in context.table1 
           .Where(x => x.table_Id == MinMax.table_Id_Max) 

       //left join **reference 3** 
      from Firsttable1 in context.table1 
           .Where(x => x.table_Id == MinMax.table_Id_Min) 
           .Where(firstNoticeFilter) //a working expression<func<>> 
           .DefaultIfEmpty() 

       //left join **reference 4** 
      from Lasttable2 in listtable2 
           .Where(x => x.table_Id == MinMax.table_Id_Max) 
           .SelectMany(x => x.table2) 
           .Where(x => x.table2_Id == 123) 
           .OrderByDescending(x => x.table_Id) 
           .Take(1) 
           .DefaultIfEmpty() 

,如果你发现//左侧的代码加入上述

参考3那条款; .Where(x => x.table_Id == MinMax.table_Id_Min)
可能有时; .Where(x => x.table_Id == MinMax.table_Id_Max)

我可以复制/粘贴整个from,并在添加noop模式的同时更改where子句(返回false的表达式,这使得实体框架删除整个事物,因此它不会影响生成的sql /结果)在from

(这是对噪音的问题),我说的noop表达是;

Expression<Func<table1, bool>> includeFrom= x => false; 

,并会使用像

    //left join **reference 3** 
      from Firsttable1 in context.table1 
           .Where(x => x.table_Id == MinMax.table_Id_Min) 
           .Where(firstNoticeFilter) //a working expression<func<>> 
           .Where(includeFrom) //<--- this line make it a noop if the expression stay false 
           .DefaultIfEmpty() 

,但我不想这样做,如果有可能使自定义表达式将进入.Where()

+0

你实际上是试图实现内置方法的语法加入LINQ的? https://msdn.microsoft.com/en-us/library/bb534675(v=vs.110).aspx – user6144226

+0

@ user6144226,是的,我试图在混合查询语法和方法语法时进行连接,连接将是动态的 – Fredou

+0

如果你想做一个'Join',你为什么要用'SelectMany'而不是'Join'? – Servy

回答

0

而不是创造一个的基于一种类型的表达式,您可以创建一个组合类型并将其用于您的where表达式。

表两个组合式

public class TwoTableDto 
{ 
    public Table1 t { get; set; } 
    public Table2 a { get; set; } 
} 

查询而不表达

var query = (from t in context.table1 
      from a in context.anothertable1 
      select new TwoTableDto { t = t, a = a }) 
      .Where(x => x.t.id == x.a.id); 

表达

Expression<Func<TwoTableDto, bool>> expr = x => x.t.id == x.a.id; 

查询与表达

var query = (from t in context.table1 
       from a in context.anothertable1 
       select new TwoTableDto { t = t, a = a }) 
       .Where(expr);   
相关问题