如何使用Include in GroupBy

How to use Include in GroupBy

这是我模型的一部分:

public class Transaction
{
    public int Id { get; set; }
    public Decimal Amount { get; set; }
    public DateTime Date { get; set; }
    public string Comment { get; set; }
    public Subcategory TransactionSubcategory { get; set; }
    public Member OwnerMember { get; set; }
    public int TransactionSubcategoryId { get; set; }
    public int OwnerMemberId { get; set; }
}

public class Subcategory
{
    public Subcategory()
    {
        IsGlobal = false;
        Transactions = new List<Transaction>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public Category OwnerCategory { get; set; }
    public List<Transaction> Transactions { get; set; }
    public bool IsGlobal { get; set; }
}

public class Category
{
    public Category()
    {
        IsGlobal = false;
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Subcategory> Subcategories { get; set; }
    public TransactionType TypeOfTransaction { get; set; }
    public Budget OwnerBudget { get; set; }
    public bool IsGlobal { get; set; }
}

public class Member
{
    public Member()
    {
        Transactions = new List<Transaction>();
    }
    public Budget OwnerBudget { get; set; }
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedTime { get; set; }
    public List<Transaction> Transactions { get; set; }
}

在这个方法中我尝试包含 TransactionSubcategory.OwnerCategory

    private List<ReportMembers> GetMembersReport(IQueryable<Transaction> transactions)
    {
        var members = transactions
            .Include(t=> t.TransactionSubcategory.OwnerCategory)
            .GroupBy(t => t.OwnerMember, t => t)
            .ToList();
...
     }

但它仍然是空的。如果我改成

        var members = transactions
            .GroupBy(t => t.OwnerMember, t => t)
            .Include(t=> t.Select(t2 => t2.TransactionSubcategory.OwnerCategory))
            .ToList();

我遇到错误:

An exception of type 'System.ArgumentException' occurred in EntityFramework.dll but was not handled in user code

Additional information: The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

首先:从数据库中选择时应该包括那些导航:

from o in context.Transactions.Include("TransactionSubcategory").Include("TransactionSubcategory.OwnerCategory")
...
select o

第二:从这里删除包含

var members = transactions
            .GroupBy(t => t.OwnerMember, t => t)
            .ToList();

第三:我相信你想按 ID 分组而不是按 class,因为按引用类型分组不会给你预期的结果。所有具有相同字段的 class 将生成不同的组,因为它们具有不同的引用。

var members = transactions
                .GroupBy(t => t.OwnerMember.Id, t => t)
                .ToList();

我找到了解决办法。如果我首先制作 ToList 然后 GroupBy 它的作品。

var members = transactions
            .Include(t => t.TransactionSubcategory.OwnerCategory)
            .Include(t=> t.OwnerMember).ToList()
            .GroupBy(t => t.OwnerMember, t => t)