linq не в запросе - PullRequest
       29

linq не в запросе

1 голос
/ 11 ноября 2009

Я заблудился в linq-land, пытаясь превратить этот SQL (который дает нужные мне результаты) во что-то, что работает в linq / C #. Результат окажется в списке выбора.

select Agencies.AgencyName, Agencies.AgencyId
from Agencies
where Agencies.Active = 1 and Agencies.AgencyId not in (
  select distinct Agencies.AgencyId
  from Agencies, AgenciesDonors
  where AgenciesDonors.AgencyId = Agencies.AgencyId and
        AgenciesDonors.DonorId = '73B29E01-8BF0-4EC9-80CA-089BA341E93D')

Значение Guid будет передаваться каждый раз.

Помощь очень ценится после долгого дня бездействия.

РЕДАКТИРОВАТЬ: я должен был сказать, что я работаю в контексте MVC 1.0 / EF. Не уверен, как это изменит первоначальные ответы.

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

Если я что-то упустил, добавление таблицы Agencies в подзапрос не требуется. Так что-то вроде этого должно работать:

from a in dataContext.Agencies
where a.Active == 1 &&
      !(from inner in dataContext.AgenciesDonors
        where inner.DonorId == donorID
        select inner.AgencyId).Contains(a.AgencyId)
select a
1 голос
/ 11 ноября 2009

Это должно сработать

var query = from c in dc.Agencies 
            where c.agencies == 1 && 
                  !(from o in dc.AgenciesDonors 
                    where o.DonorId = myDonorId 
            select o.AgencyId).Contains(c.AgencyId) 
            select c;

Linq to SQL превратит несуществующее в несуществующее, которое обычно имеет лучшую производительность, чем оператор not в SQL.

0 голосов
/ 11 ноября 2009
var query = from a in dc.Agencies 
            let ad = from o in dc.AgenciesDonors 
                     where o.DonorId = myDonorId 
                     select o.Agencies.AgencyId
            where a.Active == 1 && !ad.Contains(a.AgencyId) 
            select c;

Я считаю, что это более точный синтаксис, поскольку он отменяет необходимость вложения оператора соединения на AgenciesDonors в агентства, чтобы получить AgencyId, это должно выполняться в DataContext (dc), поскольку o.Agencies.AgencyId в " оператор let "будет работать только при запуске как IQueryable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...