【问题标题】:Nested Select in LINQ with Lambda Expression使用 Lambda 表达式的 LINQ 中的嵌套选择
【发布时间】:2013-06-11 01:27:25
【问题描述】:

我有两个对象序列;即Messages 用于Message 对象和Newsflashes 用于Newsflash 对象。

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

如您所见,Newsflash 继承自 Message。但是,控制器中生成的索引不知何故出错,我需要手动查询以将正确的序列传递给视图。

Newsflash 表只有一列,即 Id,同时是 Message Id 的外键。 我想在LINQ中这样查询SELECT * FROM MESSAGE WHERE ID IN (SELECT ID FROM NEWSFLASH)

到目前为止,我已经尝试过这样的事情: var message = Messages.Where(x => x.Id == Newsflash.Any(y=>y.Id))

但我收到无法将 int 转换为 bool 的错误。我做错了什么?如何在 LINQ 中处理嵌套选择,尤其是来自列表的选择?如何访问序列中的元素;在这种情况下Newsflash 以便我可以单独获取 ID?

【问题讨论】:

    标签: linq asp.net-mvc-4 entity-framework-5


    【解决方案1】:

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

    要获取包含新闻快讯的消息列表,您应该使用:

    var messages = (from m in Messages
                    join n in Newsflash on m.Id equals n.Id
                    select m).ToList();
    

    这将根据每个消息的 Id 将消息加入到您的新闻快讯中,然后选择匹配的消息对象。

    另一种兰巴语法:

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

    【讨论】:

    • 如果我要使用 lambda 表达式 thingy,我应该怎么做?
    • 我试过var messages = db.Messages.Select(x=> x.Id).Intersect(db.Newsflashes.Select(y=>y.Id));,但它返回System.Collections.Generic.List1[System.Int32]`而不是Message的序列。我应该怎么做才能获取整个对象而不是只获取 Id 字段?
    • db.Messages.Join(db.Newsflashes, x => x.Id, y => y.Id, (x, y) => x).ToList() 这将返回所有匹配的消息对象
    【解决方案2】:

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

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

    var message = Messages.Where(x => Newsflash.Select(y => y).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));
    

    【讨论】:

    • 太棒了。我以后会用这个参考! +1
    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2014-10-03
    相关资源
    最近更新 更多