【发布时间】:2018-01-29 08:55:08
【问题描述】:
使用实体框架(LINQ to Entities)
以下工作正常。表达式被翻译成 SQL
var foos = ctx.Foos.Select(f => new {
P1 = ctx.Bars.FirstOrDefault(b => b.SomeProp == "Const1" && f.X1 == b.Y),
P2 = ctx.Bars.FirstOrDefault(b => b.SomeProp == "Const2" && f.X2 == b.Y),
P3 = ctx.Bars.FirstOrDefault(b => b.SomeProp == "Const3" && f.X3 == b.Y),
}
重复表达式b.SomeProp == "..." && f.X* == b.Y实际上是真实表达式的简化版本,但如果你能帮助我理解这一点。剩下的我也会想办法的……
我想写的是这样的。 (首选)
var foos = ctx.Foos.Select(f => new {
P1 = f.GetBar("Const1", f.X1),
P2 = f.GetBar("Const2", f.X2),
P3 = f.GetBar("Const3", f.X3),
}
但我也可以接受类似的东西
P1 = ctx.Bars.GetByFoo(f.X1, "Const1");
- or -
P1 = ctx.Bars.FirstOrDefault(GetByFoo(f.X1, "Const1"))
- or -
P1 = ctx.Bars.GetByFoo(x => x.X1, "Const1");
基于这个答案https://stackoverflow.com/a/2244917/2968001到目前为止我最接近的是
ctx.Bars.FirstOrDefault(GetByFoo(x => x.Y == f.X1 , "Const1"))
and
private static Expression<Func<Bar, bool>> GetByFoo(Func<Foo, bool> optionSelector, string par1)
{
return b => b.SomeProp == par1 && optionSelector(o);
}
不幸的是,这 a) 仍远未达到预期 b)这不起作用:(。它给出了一个运行时异常:
从范围 '' 引用的类型为 'Foo' 的变量 'f',但它不是 定义
表达式保持可翻译是很重要的。我不适合检索所有 foo,然后检索每个 foo 的 Bar。
【问题讨论】:
-
问题是一切都是select lambda表达式树的一部分,因此不可执行也不可翻译,因为翻译是基于知识的,因此无法支持未知方法。
-
1/2/3 字段(在我看来)就像您试图将其用作 FK。如果是这种情况,那么您为什么不使用 EF 的默认导航属性方法呢?您无需手动将两个实体连接在一起,EF 可以为您完成。
-
@Flater 他们几乎是 FK。 Bar.Y 不是唯一的,但是 Y 和 SomeProp 的组合是唯一的。但是属性 X1、X2、X3 并不“知道” SomeProp 值,这就是为什么我仍然需要提供它。
标签: c# entity-framework linq linq-to-entities expression