我意识到这部分是主观的,但是我对社区的意见普遍感到好奇,并且未能成功找到解决该问题的现有问题。

我正在与一位同事进行一场关于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;
})

注意事项:
  • 这是Linq-to-Entities
  • 这是在数据库中完成并返回
  • 的工作之后
  • 输入参数r是匿名

  • 我个人认为(a)select子句不应更改值,而应仅是投影。他的反论点是他没有改变任何东西,只是确保由于数据库查询而正确地初始化了所有内容。其次,我认为一旦他开始进入完整的代码块并返回语句,就该定义一个方法,甚至是一个Func<T, U>,而不是直接完成所有这些内联操作。同样,这里的复杂者是匿名输入,因此需要定义类型。但是,尽管如此,我们仍在争论一般性问题。

    那么,lambda表达式什么时候做太多呢?您在哪里在沙子上画模糊线?

    最佳答案

    我的第一个直觉是主要在规模和复杂性方面与您达成一致。

    但是,在将它(或有时被)作为.NET代码以外的其他内容(尤其是将其转换为SQL查询的一部分)执行的上下文中使用它时,我将更加容忍它。

    所以,这就是我画模糊线的地方,也是我再次移动它的原因:)

    10-07 13:57