Entity Framework 分组子集合

3

我使用Entity Framework 6,我的数据库结构如下(简化版):

交易表 - Id - DateTime - ...

产品表 - Id - 名称

交易明细表 - Id - 交易Id - 产品Id

如您所见,交易和产品之间的关系是多对多类型。

我不知道如何使用LINq按产品分组交易 - 类似于以下内容:

transactions.GroupBy(t => t.TransactionsItems.Product)

TransactionsItems属性是由实体框架生成的导航属性,包含与该交易相关联的项目集合。

我知道我可以遍历所有产品,然后搜索transactionItems并累积数据,但我想知道是否有更简单的方法来实现我的目标?


1
在 EF 中,多对多关系不要求您将 链接 表添加到上下文中。然后将有带有“产品”集合的“事务”,反之亦然。而且您不需要进行分组。 - xZ6a33YaYEfmv
2个回答

1

就像@ieaglle所说的那样,在EF中不需要链接表。但是,如果您必须使用此结构,则以下行应该可以工作:

var result = transactionItems.GroupBy(k => k.ProductID, k => trans
.FirstOrDefault(q => q.TransactionID == k.TransactionID));

编辑:我已附上我的整个测试代码:

class Product
{
    public string Name { get; set; }
    public int ProductID { get; set; }
}

class Transaction
{
    public string MyProperty { get; set; }
    public int TransactionID { get; set; }
}

class Connect
{
    public int ProductID { get; set; }
    public int TransactionID { get; set; }
}

而程序本身:

class Program
{
    static void Main(string[] args)
    {
        List<Product> products = new List<Product>();
        products.Add(new Product(){ProductID = 1});
        products.Add(new Product(){ProductID = 2});
        List<Transaction> trans = new List<Transaction>();
        trans.Add(new Transaction(){TransactionID = 10});
        trans.Add(new Transaction(){TransactionID = 20});
        trans.Add(new Transaction() { TransactionID = 50 });
        List<Connect> con = new List<Connect>();
        con.Add(new Connect(){TransactionID = 10, ProductID = 1});
        con.Add(new Connect(){TransactionID = 20, ProductID = 1});
        con.Add(new Connect() { TransactionID = 50, ProductID = 2 });

        var r1 = con.GroupBy(k => k.ProductID, k => trans.FirstOrDefault(q => q.TransactionID == k.TransactionID));
    }
}

我使用数据库优先的方法。当我删除TransactionItems实体时,Transaction内就没有Products集合了。我的关联表也包含有关数量等信息,因此我需要这个表。我无法理解你的代码。 - Lukas
我的代码按交易项中的产品 ID 进行分组,并针对每个分组选择相关的 Transaction 对象。你试过运行吗? - Maor Veitsman
我已经创建了一个简化版本,对我来说它是有效的。对你来说有什么问题? - Maor Veitsman
我已经附上了我的整个测试代码。如果与您的问题无关,请告诉我。 - Maor Veitsman

1
也许你只是需要按特定列进行分组:
transactions.GroupBy(t => t.TransactionsItems.Product.Name)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接