加入两个表达式>
问题描述:
基于本地表达式变量可以加入两个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()
答
而不是创造一个的基于一种类型的表达式,您可以创建一个组合类型并将其用于您的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);
你实际上是试图实现内置方法的语法加入LINQ的? https://msdn.microsoft.com/en-us/library/bb534675(v=vs.110).aspx – user6144226
@ user6144226,是的,我试图在混合查询语法和方法语法时进行连接,连接将是动态的 – Fredou
如果你想做一个'Join',你为什么要用'SelectMany'而不是'Join'? – Servy