通过LINQ查询中的关系数据过滤数据不起作用


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(select [c]}'是无效的。表达式应表示属性访问:'t => t.myproperty'。有关包含相关数据的更多信息,请参见http://go.microsoft.com/fwlink/?linkid=746393

我尝试了所有可能的选项,但它仍然无法正常工作。有人建议存储程序可以工作,但我不做存储的过程。

取决于您要过滤的内容将确定答案:

我的猜测是,您需要所有具有帐户tattype.chartofaccounts.subscriber匹配我提供的ID的帐户类别。这将返回帐户类别,并急切地加载所有帐户类型及其各自的帐户图表。

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

在深度嵌套的标准上查询有点痛苦。

相反,如果您想过滤每个帐户类别的图表类别,仅返回到具有该订户ID的图表,则EF无法过滤实体集,因此您必须在该过滤后的集合上进行选择。取决于需要进行过滤的高度(即包括/排除帐户类型和/或子类别(将控制查询的复杂性。从本质上讲,要过滤子收集,您需要与顶级实体明确选择它们。

如果上面的示例没有反映您所追求的内容,请附加示例数据状态和所需的输出,我们可以查看是否可能/如何可能。

最新更新