实体框架分组子集合

本文关键字:子集合 框架 实体 | 更新日期: 2023-09-27 18:15:46

我使用实体框架6,我有这样的数据库结构(简化):

事务- - - - - - Id- - - - - - DateTime-…

产品- - - - - - Id——名称

TransactionsItems- - - - - - Id——TransactionId——ProductId

如你所见,交易<->产品是多对多类型。

我不知道如何使用LINq按产品分组事务-类似

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

其中TransactionsItems属性是由实体框架生成的导航属性,包含与此事务相关的项的集合。

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

实体框架分组子集合

也许你只是按特定的列分组:

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

就像@ ieagle说的,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));
    }
}