C# 如何在linq中查询此信息

C# 如何在linq中查询此信息,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我有这个SQL 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 如您所见,我希望获得所有[LeftHand]对象(包括没有[Righ

我有这个SQL

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 

如您所见,我希望获得所有[LeftHand]对象(包括没有[RightHand]的对象),但如果它们有[RightHand],则其ID必须来自此列表(59,60,63,64,65)

那么如何在LINQ中获得相同的结果呢?

LINQ到实体,
框架4


谢谢

您能为我澄清一点吗?在您的问题中,您声明ID必须来自列表

但是如果他们有一个[右手],那么它的ID必须来自这个列表(59,60,63,64,65)

但是你的SQL却恰恰相反;它将ID从列表中排除

其中[Head].[rightland_Id]不在(59,60,63,64,65)

您想从列表中包括ID还是将其排除


假设您确实希望排除它们;这应该对你有好处

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 are in the list
|| ids.Contains(l.Head.RightHand_Id));
我解决了

万一有人需要答案

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;
}
使用(var context=new ContextName())
{
var id=新列表{59,60,63,64,65};
var结果=
从上下文中的l.LeftHand
将头部连接到contaxt中。头部在l上等于头部。左手进入ljh
从ljh.DefaultIfEmpty()中的j1开始
其中!ids.Contains(j1.RightHand.ID)| | j1==null
选择l;
}

谢谢DoctaJonez医生您的回答帮助我做到了这一点。

谢谢DoctaJonez医生的快速回答,现在已经很晚了,我明天会试试。顺便说一句我需要不在列表中的右手你是对的这是我的错误不幸的是,不起作用,“l.Head”是一个集合(一对多)
//or right hands that are in the list
|| ids.Contains(l.Head.RightHand_Id));
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;
}