【问题标题】:LINQ Group by performing join across multiple tables/classesLINQ Group 通过跨多个表/类执行连接
【发布时间】:2017-10-12 14:41:57
【问题描述】:

我的数据库中有这样的表结构:

Items <=  User  => Transactions

所以在 C# 映射类中,User 包含 Items 和 Transactions 的集合...(一对多关系)..

所以现在我所做的如下:

   var filteredProducts = ctx.Transactions.Where(x => x.SearchedUserID == 
    firstRequest.SearchedUserID)
    .OrderByDescending(x => x.TransactionDate)
    .GroupBy(x => x.TransactionID ).Select(x => new ResultItem()
    {
     TransactionID = x.Key,
     SaleNumber = x.Sum(y => y.QuantityPurchased)                 
     })
     .ToList();

如您所见,我正在按事务表中的数据进行分组...现在我想在这里做的事情,如果可能的话,以一种简单的方式将 User 表转到 Items 表并选择一个特定的我需要的那个分组项目的属性,即 CurrentPrice,并且表 Transactions 不包含此数据...

所以在选择语句中,我想像这样提取 CurrentPrice 属性:

.Select(x => new ResultItem()
        {
         TransactionID = x.Key,
         SaleNumber = x.Sum(y => y.QuantityPurchased),
         CurrentPrice = // somehow go to Items table and pick up this data 
         })
         .ToList();

有人可以帮帮我吗?

【问题讨论】:

  • Transactions 是否对Items 有任何引用?假设客户总共购买了 4 件商品,2 件 A、1 件 B 和 1 件 C。此外,假设客户最初购买了 1 件商品 A 和 1 件 B,然后又购买了 1 件 A 件和 1 件 C。据说客户有一个包含 4 个项目的列表和一个包含 2 个交易的列表。每笔交易与客户购买的商品之间是否有任何联系?
  • @Christos no ,项目和交易之间没有引用,它们只是通过用户表链接..
  • 您可以发布架构吗?你按TransactionID 分组对我来说很奇怪。根据定义,ID 应该是唯一的。
  • @User987 如果您无法通过查看与客户关联的交易来判断客户购买了什么,我看不出您如何找到您正在寻找的东西。是我上面描述的情况还是系统是以其他方式设计的?具体来说,您是否有多个项目的交易或每个项目的一个交易?我不清楚,因为您按TransactionID 分组。这不是 Transactions 表的主键吗?如果是这样,为什么要按TransactionID 分组?您能否发布项目、用户、交易及其基础关系的架构详细信息?
  • 你想CurrentPrice 作为items 属于SearchedUserID 的一部分吗?@User987

标签: c# asp.net asp.net-mvc linq c#-4.0


【解决方案1】:

就我获得您的表架构而言,您应该在通过SearchUserId 过滤数据时从用户表开始查询,因此,首先获取具有用户表关系的数据

注意:因为我不知道您的表架构 UserId 在此示例代码中被视为 User 表主键和 TransactionsItems 表外键

    var result = (from usr in ctx.User
                 where  usr.UserId == firstRequest.SearchedUserID
                 select new {
                    UserId = usr.UserId,
                    Transactions = usr.Transactions,
                    Items = usr.Items
                 })

然后尝试对数据进行过滤、分组、...。但是,如果您想选择您在问题中提到的内容,您应该在 ItemsTransactions 表之间建立关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多