【问题标题】:LINQ Grouping a List of Objects into Anonymous TypeLINQ 将对象列表分组为匿名类型
【发布时间】:2020-05-20 18:18:52
【问题描述】:

我很难尝试使用 LINQ 查询 sql 数据库,以便将一个表中与另一个表中的对象 (a) 关联的所有对象 (b) 分组为具有 (a) 和(b) 的列表。本质上,我有一个包含报价表的数据库,以及另一个包含与这些报价相关的操作历史记录的表。我想做的是以这样一种方式对它们进行分组,即我有一个包含每个报价的匿名类型列表,以及对该报价采取的每项操作的列表,因此签名将是:

List<'a> 其中'a is new { Offer offer, List<OfferHistories> offerHistories}

这是我最初尝试的方法,显然行不通

var query = (from offer in context.Offers
             join offerHistory in context.OffersHistories on offer.TransactionId equals offerHistory.TransactionId
             group offerHistory by offerHistory.TransactionId into offerHistories
             select { offer, offerHistories.ToList() }).ToList();

通常我不会带着这么少的信息来 SE,但我尝试了许多不同的方法,不知道如何继续。

【问题讨论】:

  • 你应该使用GroupJoin,而不是group - 在join之后放置一个into

标签: c# linq linq-to-sql


【解决方案1】:

请尽量避免调用.ToList(),仅在确实需要时才这样做。我有一个重要的问题:你真的需要所有的 OffersHistories 栏目吗?因为对完整对象进行分组非常昂贵,所以请尝试仅对必要的列进行分组。如果你真的需要一个offer的所有offerHistories,那么我建议编写一个子选择(这也是成本更高的性能):

var query = (from offer in context.Offers
             select new { offer, offerHistories = (from offerHistory in context.OffersHistories
                                                   where offerHistory.TransactionId == offer.TransactionId
                                                   select offerHistory) });

P.s.:为外键列创建索引是个好主意,这些列在 where 和 group by 语句中使用,这些将使查询更快,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多