【问题标题】:Trying to resolve "The Include path expression must refer to a navigation property defined on the type"尝试解决“包含路径表达式必须引用在类型上定义的导航属性”
【发布时间】:2017-01-22 16:13:51
【问题描述】:

目前,我正在使用 IQueryable() 并且无法让部分查询工作。我收到了一个 System.ArgumentException,其描述在这篇文章的标题中。

我将从我需要​​但在 IQueryable() 代码中的 TSQL 查询开始:

 SELECT w.*,wr.*,c.* 
   FROM WorldRegion w
   JOIN WorldRegionResource wr
     ON w.Id = wr.Id
   JOIN Culture c
     ON wr.CultureId = c.Id
  WHERE c.CultureName = 'en-US'

现在我将破解代码:

这是实体结构:

public class WorldRegion
{
    public virtual ICollection<WorldRegionResource> WorldRegionResources { get; set; }
}
public class WorldRegionResource
{
    public Culture Culture { get; set; }
}
public class Culture
{
    public string CultureName { get; set; }
}

这是一个有效的查询(为简洁起见,删除了其他表达式),但我需要为此添加一个过滤器,因为它会返回 WorldRegion 的所有可用 WorldRegionResources,我想返回一个:

IQueryable<WorldRegion> query = repository.Queryable();

query.Include(w => w.WorldRegionResources.Select(wr => wr.Culture));

我需要添加一个过滤器:

Where Culture.CultureName == "en-US"

最初我尝试更改查询。包含(引发异常):

query.Include(w => w.WorldRegionResources.Where(wr => wr.Culture.CultureName == "en-US"));

我一直在寻找解决方案,但没有成功。 我什至尝试过构建匿名查询:

query.Include(w => w.WorldRegionResources.Select(wr => wr.Culture));
query.Select(w => new
{
    WorldRegion = w,
    WorldRegionResource = w.WorldRegionResources.Select(wr => new
    {
        WorldRegionResource = wr,
        Culture = wr.Culture.CultureName == "en-US"
    })
});

但这产生了与初始查询相同的结果。 SQL Server Profiler 甚至无法识别“en-US”参数。

提前感谢您的宝贵时间,我们非常感谢您提供任何帮助,

罗尼

【问题讨论】:

  • 可能是你没有调用ToList()
  • 你能告诉我这个查询返回数据还是查询?IQueryable query = repository.Queryable(); query.Include(w => w.WorldRegionResources.Select(wr => wr.Culture));
  • 如果没有结果,那么答案是调用 ToList()
  • 这不是问题。他在 Include 中有一个 WHERE 条件,这是不允许的。

标签: c# entity-framework linq tsql


【解决方案1】:

我相信你必须告诉实体他们映射到哪个实体。

尝试将外键属性添加到外键id。

public class WorldRegion
{
    public virtual ICollection<WorldRegionResource> WorldRegionResources { get; set; }
}
public class WorldRegionResource
{
    [ForeignKey(nameof(Culture))]
    public int CultureId { get; set; }
    public virtual Culture Culture { get; set; }
}
public class Culture
{
    public string CultureName { get; set; }
}

【讨论】:

  • 这不会解决任何问题。请参阅史蒂夫答案中的 cmets
  • 虽然这不是问题,但我在一个单独的文件中完成了映射: HasKey(t => new { t.CultureId, t.Id });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2022-01-03
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多