我意识到这部分是主观的,但是我对社区的意见普遍感到好奇,并且未能成功找到解决该问题的现有问题。
我正在与一位同事进行一场关于L2EF查询中特定Select语句的宗教辩论。
.Select(r =>
{
r.foo.Bar = r.bar;
r.foo.Bar.BarType = r.Alpha;
if (r.barAddress != null)
{
r.foo.Bar.Address = r.barAddress;
r.foo.Bar.Address.State = r.BarState;
}
if (r.baz != null)
{
r.foo.Bar.Baz = r.baz;
if (r.bazAddress != null)
{
r.foo.Bar.Baz.Address = r.bazAddress;
r.foo.Bar.Baz.Address.State = r.BazState;
}
}
return r.foo;
})
注意事项:
r
是匿名我个人认为(a)select子句不应更改值,而应仅是投影。他的反论点是他没有改变任何东西,只是确保由于数据库查询而正确地初始化了所有内容。其次,我认为一旦他开始进入完整的代码块并返回语句,就该定义一个方法,甚至是一个
Func<T, U>
,而不是直接完成所有这些内联操作。同样,这里的复杂者是匿名输入,因此需要定义类型。但是,尽管如此,我们仍在争论一般性问题。那么,lambda表达式什么时候做太多呢?您在哪里在沙子上画模糊线?
最佳答案
我的第一个直觉是主要在规模和复杂性方面与您达成一致。
但是,在将它(或有时被)作为.NET代码以外的其他内容(尤其是将其转换为SQL查询的一部分)执行的上下文中使用它时,我将更加容忍它。
所以,这就是我画模糊线的地方,也是我再次移动它的原因:)