【发布时间】: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