Как написать этот SQL-запрос в Linq To SQL - PullRequest
0 голосов
/ 25 января 2011

Я хотел бы знать, как написать следующий запрос SQL в Linq.Я пытался, но без везения.

/*Variable*/
topicId = '4a31c2ee-48af-4b87-b300-112acb822ad0'

select * from Contents c
left join ContentToTopicRelations ctr on ctr.ContentId = c.ContentId and ctr.TopicId = topidId
where ctr.ContentId is null

В принципе, я хотел бы получить все содержимое, которое отсутствует в таблице ContentToTopicRelations для определенной темы ID .

Ответы [ 3 ]

2 голосов
/ 25 января 2011

dataContext.Contents.Where(c =>
  !dataContext.ContentToTopicRelations.Any(ctr =>
     ctr.ContantId == c.ContentId &&
     ctr.TopicId == topicId))

Это идентично select * from Content where not exists(...).И в общем случае это лучше, чем левое соединение и проверка на ноль (это зависит от статистики таблицы, но ..), потому что это даст (опять же, в общем случае) полу левое соединение вместо левого соединения (в плане выполнения).

Для самого левого соединения используйте код, подобный следующему (но я рекомендую использовать код, который генерирует not exists для вашей задачи):


from c in dataContext.Contents
join tempCTR in dataContext.ContentToTopicRelations
  on new { c.ContentId, topicId) equals new { tempCTR.ContentId, tempCTR.TopicId }
  into tempCTRCollection
  from ctr in tempCTRCollection.DefaultIfEmpty()
where ctr == null
select c
0 голосов
/ 25 января 2011
topicId = '4a31c2ee-48af-4b87-b300-112acb822ad0' 

IQueryable<Content> query =
  from c in dataContext.Contents
  where !c.ContentToTopicRelations.Any(ctr => ctr.TopicId == topicId)
  select c;
0 голосов
/ 25 января 2011

topicvariable = "sdfsdfsdfsdf sdfsdfsdfsdfsdfsdfsdfsd";

var results = from c в содержании, где c.TopicId = тема-переменная select c;

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