EF7是否可以在任何地方使用?

时间:2016-02-09 12:58:18

标签: entity-framework-6 entity-framework-core

所有

道歉。这听起来有点像咆哮。它可能是。我期待更多来自最新的(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 == truepm.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 APPLYSELECT TOP 1的查询。

尝试修复:

由于实体已经从现有的EF6项目中重复使用,我尝试尽可能使用流畅而不是注释。没有改善。

1 个答案:

答案 0 :(得分:0)

此错误已在最新的代码库中修复,修复程序将在RC2中提供