2011-01-25 5 views
0

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

/*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 для конкретного TopicID.

ответ

2

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

Отлично! Большое спасибо. –

-1

topicvariable = "sdfsdfsdfsdf sdfsdfsdfsdfsdfsdfsdfsd";

var results = from c Содержание где c.TopicId = topicvariable select c;

0
topicId = '4a31c2ee-48af-4b87-b300-112acb822ad0' 

IQueryable<Content> query = 
    from c in dataContext.Contents 
    where !c.ContentToTopicRelations.Any(ctr => ctr.TopicId == topicId) 
    select c; 
Смежные вопросы