目前,我正在使用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'参数。
提前感谢您的时间,感谢任何帮助,
罗尼
答案 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; }
}