在Linq查询中无法通过关系数据过滤数据

时间:2019-05-09 18:26:40

标签: entity-framework asp.net-core extension-methods

public IEnumerable<AccountCategory> GetAllAccountsCategories(Guid applicationSubscriberId)
{
    return _context.AccountCategories.Include(s => s.AccountSubCategories)
        .ThenInclude(t => t.AccountTypes)
        .ThenInclude(d =>d.ChartOfAccounts.Where(c => c.ApplicationSubscriberId == applicationSubscriberId));           
}

这是我需要为我的项目生成的查询,但是会引发异常:

  

属性表达式“ d => {来自d.ChartOfAccounts中的ChartOfAccount c,其中([c] .ApplicationSubscriberId == __applicationSubscriberId_0)选择[c]}”无效。该表达式应表示属性访问:“ t => t.MyProperty”。有关包括相关数据的更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=746393

我已经尝试了所有可能的选项,但仍然无法使用。有人建议存储过程可以工作,但我不执行存储过程。

1 个答案:

答案 0 :(得分:0)

根据您要过滤的内容确定答案:

我的猜测是,您希望所有具有与我提供的ID匹配的AccountType.ChartOfAccounts.Subscriber的Account类别。这将返回帐户类别,并急于加载所有帐户类型及其各自的会计科目表。

var accountCategories = _context.AccountCategories
  .Include(ac => ac.AccountSubCategories)
  .ThenInclude(sc => sc.AccountTypes)
  .ThenInclude(at => at.ChartOfAccounts)
  .Where(ac => ac.AccountSubCategories
     .Any(sc => sc.AccountTypes
        .Any(at => at.ChartOfAccounts
           .Any(ac => ac.ApplicationSubscriberId == applicationSubscriberId));

查询深层嵌套的条件有点麻烦。

如果您想过滤返回的每个帐户类别的ChartOfAccounts,以仅包括具有该订户ID的图表,则EF无法过滤实体集,因此您必须分别在该过滤的集合上进行选择。根据需要进行多大程度的过滤(即包括/排除帐户类型和/或子类别)来控制查询的复杂性。本质上是要过滤子集合,您需要在顶级实体旁边明确选择它们。

如果上面的示例不能反映您的要求,那么请附加示例数据状态和所需的输出,我们将了解是否可能/如何实现。