一个更好的方法来执行此LINQ查询?

时间:2009-12-05 21:39:52

标签: c# linq c#-3.0 linq-to-objects

我有一些无法直接相互访问的数据对象集合。我想最好的解决方案是让数据库人员对此进行查询,但与此同时,有什么方法可以收紧这个问题吗?

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 个答案:

答案 0 :(得分:1)

看起来你已经从数据库中获取了所有Foos,所有FooInfos和所有Bars,以便您可以进行查询,其中您实际上只需要一个Bar对象作为结果。如果你不得不从数据库中获取所有这些对象以用于另一个查询,那么这是可以的,但如果你只为这一个查询得到所有这些对象,那么这是非常低效的。您应该尝试让数据库执行查询,并只返回您需要的一个对象。

即使没有外键约束,你仍然可以进行连接,你可以在Linq To SQL中的类型之间set up relationships,即使它们实际上不存在于数据库中,也可以更容易地制定你的查询。

答案 1 :(得分:0)

在样式上接受 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子句中是范围内的。