【问题标题】:How to use Include in GroupBy [duplicate]如何使用包含在 GroupBy [重复]
【发布时间】:2015-02-07 19:08:24
【问题描述】:

这是我模型的一部分:

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();

我遇到了错误:

EntityFramework.dll 中出现“System.ArgumentException”类型的异常,但未在用户代码中处理

附加信息:包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符。

【问题讨论】:

  • .Include("TransactionSubcategory").Include("TransactionSubcategory.OwnerCategory") 工作吗?
  • 您是否将该字段定义为外键?
  • 1) 不,它不起作用 2) 我没有为模型添加任何属性,但我找到了解决方案

标签: c# linq entity-framework


【解决方案1】:

我找到了解决方案。如果我首先制作 ToList 和后来的 GroupBy 它的作品。

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

【讨论】:

  • 但是这个解决方案非常慢,因为现在 C# 运行时正在执行分组而不是数据库引擎。
  • 那么@Stefan 的解决方案是什么?
【解决方案2】:

首先:您应该在从数据库中选择时包含这些导航:

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

第二:从这里删除包含

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2018-09-17
    • 2021-07-26
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多