使用Lambda表达式在LINQ中嵌套选择

使用Lambda表达式在LINQ中嵌套选择,linq,asp.net-mvc-4,entity-framework-5,Linq,Asp.net Mvc 4,Entity Framework 5,我有两个对象序列;即消息对象的消息和新闻快讯对象的新闻快讯 两者都是通过实体框架ADO.NET实体模型派生的。模型示意图如下: 正如您所看到的,Newsflash继承了Message。但是,控制器中生成的索引有点错误,我需要进行手动查询以将正确的序列传递给视图 Newsflash表只有一列,即Id,同时还有消息Id的外键。 我想在LINQ SELECT*FROM消息中这样查询,其中ID在SELECT ID FROM NEWSFLASH中 到目前为止,我已经尝试过这样的方法: var messa

我有两个对象序列;即消息对象的消息和新闻快讯对象的新闻快讯

两者都是通过实体框架ADO.NET实体模型派生的。模型示意图如下:

正如您所看到的,Newsflash继承了Message。但是,控制器中生成的索引有点错误,我需要进行手动查询以将正确的序列传递给视图

Newsflash表只有一列,即Id,同时还有消息Id的外键。 我想在LINQ SELECT*FROM消息中这样查询,其中ID在SELECT ID FROM NEWSFLASH中

到目前为止,我已经尝试过这样的方法: var message=Messages.Wherex=>x.Id==Newsflash.Anyy=>y.Id


但我得到了一个无法将int转换为bool的错误。我做错了什么?LINQ中如何处理嵌套选择(尤其是从列表中选择)?如何访问序列中的元素;在本例中,Newsflash使我可以单独获取Id?

Any返回布尔值,而不是值列表。如果您想要一个Newsflash ID的列表,您可以使用Newsflash.Selectx=>x.ID

要获取包含新闻快讯的邮件列表,应使用:

var messages = (from m in Messages
                join n in Newsflash on m.Id equals n.Id
                select m).ToList();
这将根据每个消息的Id将消息加入到您的新闻快讯中,然后选择匹配的消息对象

替代lamba语法:

var messages = Messages.Join(Newsflash, x => x.Id, y => y.Id, (x, y) => new { Message = x }).ToList();

Any返回布尔值,而不是值列表。如果您想要一个Newsflash ID的列表,您可以使用Newsflash.Selectx=>x.ID

要获取包含新闻快讯的邮件列表,应使用:

var messages = (from m in Messages
                join n in Newsflash on m.Id equals n.Id
                select m).ToList();
这将根据每个消息的Id将消息加入到您的新闻快讯中,然后选择匹配的消息对象

替代lamba语法:

var messages = Messages.Join(Newsflash, x => x.Id, y => y.Id, (x, y) => new { Message = x }).ToList();

如果newsflash只是一个ID列表,试试这个

var message = Messages.Where(x => Newsflash.Contains(x.Id));

简单的例子

var listOfInts = new List<int>{1,2,3,4,5,6,7,8,9,10};
var listOfInts2 = new List<int>{1,2,3,4,5};

listOfInts.Where(x => listOfInts2.Contains(x));

如果newsflash只是一个ID列表,试试这个

var message = Messages.Where(x => Newsflash.Contains(x.Id));

简单的例子

var listOfInts = new List<int>{1,2,3,4,5,6,7,8,9,10};
var listOfInts2 = new List<int>{1,2,3,4,5};

listOfInts.Where(x => listOfInts2.Contains(x));

如果我使用lambda表达式thingy,我应该怎么做?我尝试了var messages=db.messages.Selectx=>x.Id.Intersectdb.newslasks.Selecty=>y.Id;但它返回System.Collections.Generic.List1[System.Int32]`而不是消息序列。如何获取整个对象而不是仅获取Id字段?db.Messages.Joindb.newslasks,x=>x.Id,y=>y.Id,x,y=>x.ToList这将返回所有匹配的消息对象如果我使用lambda表达式thingy,我应该怎么做?我尝试了var Messages=db.Messages.Selectx=>x.Id.Intersectdb.newslasks.Selecty=>y;但它返回System.Collections.Generic.List1[System.Int32]`而不是消息序列。如何获取整个对象而不是仅获取Id字段?db.Messages.Joindb.newslash,x=>x.Id,y=>y.Id,x,y=>x.ToList这将返回所有匹配的消息objectsAwesome。我会在将来使用这个参考+1我们很好。我会在将来使用这个参考+1.