尝试解决“包含路径表达式必须引用在类型”

时间:2017-01-22 16:13:52

标签: c# entity-framework linq tsql

目前,我正在使用IQueryable(),无法使部分查询正常工作。我收到一个System.ArgumentException,其中包含此帖子标题中的描述。

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

 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(抛出异常):

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'参数。

提前感谢您的时间,感谢任何帮助,

罗尼

1 个答案:

答案 0 :(得分:-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; }
}