2009-12-05 37 views
1

我有一些数据对象的集合,不能直接从另一个访问。我想最好的解决办法是让数据库人员对此进行查询,但同时,有什么方法可以收紧这个问题?更好的方法来做这个LINQ查询?

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); 
}    
+0

你能否澄清一下,如果这是LINQ to SQL或LINQ to Objects?另外,你有连接的外键约束吗? – TrueWill 2009-12-05 21:44:22

+0

linq的对象,并没有我知道的限制 – 2009-12-05 21:51:55

+0

澄清问题:“收紧”可能意味着很多事情。你是指风格,表演还是别的? – 2009-12-06 03:18:08

回答

1

看起来你已经赚得了所有FOOS,所有FooInfos和所有的酒吧从数据库中,这样就可以做一个查询,你只有真正需要一个Bar对象作为结果。如果你不得不从数据库中获取所有这些对象以进行另一个查询,那么这是可以的,但是如果你为这个查询获得所有这些对象,那么这是非常低效的。您应该尝试让数据库执行查询,并仅返回所需的一个对象。

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

0

它可以是难以stylisticly接受加入该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子句中是范围内的。

相关问题