2009-12-05 54 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子句中是範圍內的。

相關問題