我简化的LINQJoin
加Where
两个表看起来像这样:
var join = context.Foo
.Join(context.Bar,
foo => new { foo.Year, foo.Month },
bar => new { bar.Year, bar.Month },
(foo, bar) => new { foo.Name, bar.Owner, foo.Year })
.Where(anon => anon.Year == 2015).ToList();
另外,我本可以使用以下语法,希望与之等效:
var joinQuery = from foo in context.Foo
join bar in context.Bar
on new { foo.Year, foo.Month } equals new { bar.Year, bar.Month }
where foo.Year == 2015
select new { foo.Name, bar.Owner };
var join = joinQuery.ToList();
我发生的并且我想知道的一个区别是命令的顺序。在lambda-syntax联接中,我将该foo.Year
属性添加到匿名返回类型中,以便可以进行过滤,而在其他查询中,我仍然可以在子句中使用foo
(bar
如果需要)where
。foo.Year
如果不需要,我不需要在此处将字段添加到返回类型中。
不幸的是,我没有ReSharper或类似的东西可以将较低的语句转换为lambda,以便我可以进行比较。
我实际上可以做的(并使上面的语句在结构上与下面的语句更相似)是在第一个Where(..)
和之间添加以下行ToList()
:
.Select(anon => new { /* the properties I want */ })
但这是否仅比第二条语句增加了“一个”匿名类型创建,还是我在这里弄错了?
简而言之:Join
第二条语句的等效语法是什么?还是第一个加上所添加的值Select
真的相等,即joinQuery
内部是否产生相同的代码?
通常,您无法始终以与编译器完全相同的方式在查询理解语法和lambda语法之间进行转换。这是由于使用了透明标识符。但是您可以解决此问题并产生语义上等效的lambda语句。这就是ReSharper所做的。
无论如何,您可以添加:
.Select(anon => new { /* the properties I want */ })
这将为每行实例化一个匿名类型,但是不会再“一个”,因此不必担心:表达式被转换为SQL,因此中的new { foo.Year, foo.Month }
语句join
并没有真正实例化这些对象,它们只是转换为SQL。SELECT
一旦检索到行,则只有最后一个选择将既用于SQL列表,又用于对象水化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句