2010-09-24 3 views
0

у меня есть этот SQLкак запросить это в LINQ

SELECT * 
FROM [dbo].[LeftHand] 
     left outer JOIN [dbo].[Head] ON [LeftHand].[ID] = [Head].[LeftHand_Id] 
     WHERE [Head].[RightHand_Id] Not IN (59,60,63,64,65) or [Head].[RightHand_Id] is null 

 [Head] 
     */ \* 
     / \ 
     1/  \1 
[LeftHand] [RightHand]  ([LeftHand may have more than one [RightHand] ) 

Как вы можете видеть, я хочу, чтобы получить все [LeftHand] объекты (в том числе те, которые этого не делают есть ли [RightHand]), но в случае, если у них есть [RightHand], тогда это должен быть идентификатор из этого списка (59,60,63,64,65)

Итак, как я могу получить тот же результат в LINQ ?

LINQ для лиц,
Framework 4

благодаря

ответ

0

Не могли бы вы уточнить один момент для меня, хотя, в вашем вопросе вы утверждаете, что идентификатор должен быть из списка

но в случае, если у них есть [RightHand], то его идентификатор должен быть указан из этого списка (59,60,63,64,65)

, но ваш SQL делает наоборот; она исключает идентификаторы из списка

ГДЕ [Глава]. [RightHand_Id] Не IN (59,60,63,64,65)

Вы хотите включить идентификаторы из списка или исключить их?


Предполагая, что вы действительно хотите их исключить; это должно сделать трюк для вас.

using (var context = new ContextName()) 
{ 
    //here are the ids we want to filter by 
    var ids = new List<int> { 59,60,63,64,65 }; 
    //get all left hands without a matching right hand 
    var result = context.LeftHands.Where(l => l.Head.RightHand_Id == null 
              //or right hands that aren't in the list 
              || !ids.Contains(l.Head.RightHand_Id)); 
} 

Если вы хотите включить их вместо этого; изменить эту часть кода ...

//or right hands that aren't in the list 
|| !ids.Contains(l.Head.RightHand_Id)); 

посмотреть, как это ...

//or right hands that are in the list 
|| ids.Contains(l.Head.RightHand_Id)); 
+0

спасибо DoctaJonez за быстрый ответ, здесь очень поздно, я постараюсь завтра. кстати .. мне нужны правые руки, которых нет в списке Вы правы, это моя ошибка – SomeOne164

+0

К сожалению, это не работает, «l.Head» - это коллекция (одна для многих) – SomeOne164

0

Я решил его

в случае какой-либо один нужен ответ

using (var context = new ContextName()) 
{ 
    var ids = new List<int> { 59,60,63,64,65 }; 
    var result = 
     from l in context.LeftHand 
     join Head in contaxt.Head on l equals Head.LeftHand into ljh 
     from j1 in ljh.DefaultIfEmpty() 
     where !ids.Contains(j1.RightHand.ID) || j1 == null 
     select l; 
} 

спасибо DoctaJonez, ваш ответ помог мне добраться до этого.

+0

Добро пожаловать, Я рад, что вам удалось разобраться в этом :-) –