Dynamic Linq 创建多个查询
Dynamic Linq creates multiple queries
在普通 linq 中对 sql 的以下 linq 调用导致对数据库的 1 SQL 查询
Table1.Select(t => new {Table2.First().Property1})
但我似乎无法让 Dynamic Linq 达到相同的效果,下面会产生 2 个单独的查询。
Table1.Select("new(@0.Property1)", Table2.First())
这也不行
Table1.Select("@0", Table2.First().Property1)
或这个
Table1.Select("new(@0 as MyField)", Table2.First().Property1)
我错过了什么?
它生成两个单独的查询,因为在该上下文中,Table2.First()
是与查询的其余部分分开的调用。它没有集成到生成的表达式中。就好像你这样做了:
var first = Table2.First(); // evaluated eagerly due to the First() call
var query = Table1.Select("new(@0.Property1)", first);
如果用第二个 table.
的笛卡尔积重写它,您可以获得预期的结果
var query = Table1.SelectMany(t1 =>
Table2.Take(1).Select(t2 => new { t1, t2 })
)
.Select("new(t2.Property1 as MyField)");
感谢 Jeff 的见解,正确的查询安排应该是
Table1.Select(t => new {t2 = Table2.First()}).Select("new(t2.Property1)")
它产生对数据库的单个查询调用
在普通 linq 中对 sql 的以下 linq 调用导致对数据库的 1 SQL 查询
Table1.Select(t => new {Table2.First().Property1})
但我似乎无法让 Dynamic Linq 达到相同的效果,下面会产生 2 个单独的查询。
Table1.Select("new(@0.Property1)", Table2.First())
这也不行
Table1.Select("@0", Table2.First().Property1)
或这个
Table1.Select("new(@0 as MyField)", Table2.First().Property1)
我错过了什么?
它生成两个单独的查询,因为在该上下文中,Table2.First()
是与查询的其余部分分开的调用。它没有集成到生成的表达式中。就好像你这样做了:
var first = Table2.First(); // evaluated eagerly due to the First() call
var query = Table1.Select("new(@0.Property1)", first);
如果用第二个 table.
的笛卡尔积重写它,您可以获得预期的结果var query = Table1.SelectMany(t1 =>
Table2.Take(1).Select(t2 => new { t1, t2 })
)
.Select("new(t2.Property1 as MyField)");
感谢 Jeff 的见解,正确的查询安排应该是
Table1.Select(t => new {t2 = Table2.First()}).Select("new(t2.Property1)")
它产生对数据库的单个查询调用