所有
道歉。这听起来有点像咆哮。它可能是。我期待更多来自最新的(7.0.0-rc1-final)EF7。欢迎任何评论或提示!
请随意询问表格/字段结构,但我希望单独命名将会清楚。
我的第一个EF7查询:
var enrichedProducts = this.productContext.Products
.AsNoTracking()
.Where(p => productNumbers.Contains(p.SAPProductNumber))
.Select(p => new
{
SAPProductNumber = p.SAPProductNumber,
DisplayName = p.DisplayName,
Brand = p.Brand,
Type = p.Type,
MultimediaValueEpochTime = p.ProductMultimedias
.Where(pm => pm.Visible == true
&& pm.ValueEpochTime != null)
.OrderByDescending(pm => pm.MainItem == true)
.ThenBy(pm => pm.SortOrder)
.Select(pm => pm.ValueEpochTime)
.FirstOrDefault()
})
.ToList();
此查询产生SqlException:'='附近的语法不正确。
原因是OrderByDescending(pm => pm.MainItem == true
。 pm.MainItem
是de数据库中的可空位。 EF7将其转换为SQL Server不喜欢的ORDER BY [pm].[MainItem] = 1 DESC
。 EF6非常精心地翻译它,但至少它可以工作:
CASE WHEN (1 = [Extent2].[MainItem]) THEN cast(1 as bit) WHEN ( NOT ((1 = [Extent2].[MainItem]) AND ([Extent2].[MainItem] IS NOT NULL))) THEN cast(0 as bit) END AS [C1]
和
ORDER BY [Project1].[C1] DESC
但还有更糟糕的事情!
从== true
中删除OrderBy
后,查询有效。令我惊讶的是,SQL Server上发出了9个查询!很容易解释'9'。 productNumbers
集合中有8个产品编号。哦,我的......
更糟糕的是:这8个查询完全相同;他们的where子句中甚至没有8个产品编号中的一个!此外,这8个查询根本不与Products表关联。这一切有多奇怪......
EF6很好地将其转换为1个OUTER APPLY
和SELECT TOP 1
的查询。
尝试修复:
由于实体已经从现有的EF6项目中重复使用,我尝试尽可能使用流畅而不是注释。没有改善。
答案 0 :(得分:0)
此错误已在最新的代码库中修复,修复程序将在RC2中提供