如何使用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)
这是我模型的一部分:
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)