代码之家  ›  专栏  ›  技术社区  ›  J Cooper

一个更好的方法来做这个LINQ查询?

  •  1
  • J Cooper  · 技术社区  · 16 年前

    我有一些不能直接从彼此访问的数据对象集合。我想最好的解决方案是让数据库人员对此进行查询,但同时,有没有什么方法可以加强这一点?

    var conflicting = allFoos.Where(foo => foo.ElectronicSerialNumber != 0 
                                    && foo.BarID != interestingBar.ID)
                        .Join(fooInfoCollection, foo => foo.ElectronicSerialNumber, 
                                                 fooInfo => fooInfo.ElectronicID, 
                                                 (foo, fooInfo) => foo)
                        .Join(allBars, foo => foo.BarID, bar => bar.ID, (foo, bar) => bar)
                        .Where(bar => bar.SomeCriteria == false)
                        .FirstOrDefault();
    if (conflicting != null)
    {
       doStuff(conflicting);
    }               
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Mark Byers    16 年前

    看起来您已经从数据库中获取了所有foo、所有fooifos和所有bar,这样您就可以在只需要一个bar对象作为结果的地方执行查询。如果您必须为另一个查询从数据库中取出所有这些对象,那么这是可以的,但是如果您只为这个查询获得所有这些对象,那么这是非常低效的。您应该尝试让数据库执行查询,并且只返回所需的一个对象。

    即使没有外键约束,也可以进行联接,并且可以 set up relationships 在LINQ到SQL之间的类型之间,即使它们实际上不存在于数据库中,也更容易制定查询。

        2
  •  0
  •   Amy B    16 年前

    在文体上很难接受 lambda语法 使用。 查询理解语法 更适合加入。执行相同的操作。

    Bar conflicting = 
    (
      from foo in allFoos
      where foo.ElectronicSerialNumber != 0
      where foo.BarID != interestingBar.ID
      join fooInfo in fooInfoCollection
      on foo.ElectronicSerialNumber equals fooInfo.ElectronicID
      join bar in allBars
      on foo.BarID equals bar.ID
      where !bar.SomeCriteria
      select bar
    ).FirstOrDefault();
    

    注意,foo和fooinfo(和bar)在select子句的作用域中,如果您想使用它们的话。