2017-10-06 134 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);   
相關問題