2009-12-05 2 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 для объектов? Кроме того, есть ли у вас ограничения внешнего ключа для соединений? – TrueWill

+0

linq к объектам, и никаких ограничений, о которых я знаю –

+0

Уточняющий вопрос: «затяните это» может означать много чего. Вы имеете в виду стиль, производительность или что-то еще? –

ответ

1

Похоже, что вы выбрали все FOOS, все FooInfos и все Bars из базы данных, так что вы можете сделать запрос, где вы только действительно нужен один объект Bar в качестве результата. Если бы вы все равно должны были вытащить все эти объекты из базы данных для другого запроса, тогда это нормально, но если вы получили все эти объекты только для этого одного запроса, то это крайне неэффективно. Вы должны попытаться заставить базу данных выполнить запрос и вернуть только тот объект, который вам нужен.

Даже если нет ограничений по внешнему ключу, вы все равно можете создавать соединения, и вы можете использовать set up relationships между типами в Linq To SQL, даже если они фактически не существуют в базе данных, что упрощает формулировку ваших запросов.

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 (и бар) находятся в области видимости в выбранном пункте, если вы хотите использовать их.

Смежные вопросы