Лучший способ сделать этот запрос LINQ? - PullRequest
1 голос
/ 06 декабря 2009

У меня есть несколько коллекций объектов данных, к которым нет прямого доступа друг к другу. Я полагаю, что лучшим решением было бы заставить ребят из базы данных сделать запрос на это, но в то же время, есть ли способ как-то это уладить?

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 ]

1 голос
/ 06 декабря 2009

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

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

0 голосов
/ 06 декабря 2009

Может быть сложно стилистически принять объединения, используемые Лямбда-синтаксис . Синтаксис понимания запросов имеет гораздо лучший стиль для присоединения. Те же операции выполняются.

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, если вы хотите их использовать.

...