【问题标题】:Linq is not converting to SQL properly on runtime [duplicate]Linq 在运行时未正确转换为 SQL [重复]
【发布时间】:2022-01-19 03:30:09
【问题描述】:

我在这里有一个简单的 LINQ 查询,但出现异常

函数只能从 LINQ 调用到实体

不确定它可能是什么,我知道它与我正在使用的 SqlFunctions 有关,但无法弄清楚原因。我已经看到了类似问题的先前解决方案,但我相信它不适用于这种情况 (This function can only be invoked by LINQ to Entities after Entity Framework update)。

DateTime begin = new DateTime(2021, 1, 1);
DateTime end = new DateTime(2022, 1, 1);

var dataSet = from e in _db.animals
              where e.age == 2 &&
                    SqlFunctions.DateDiff("yy",begin, end) < 2                                                        
              select e.AnimalType

【问题讨论】:

  • 你如何使用dataSet
  • 你使用实体框架吗?如果是这样,使用 EntityFunctions stackoverflow.com/questions/15637317/… 可能更合适
  • 是的,我正在使用实体框架。我也尝试过使用 EntityFunctions,但也没有太多运气。我最后将数据集作为 jsonresult 返回 - return new JsonResult(dataSet.ToDataSourceResult(request))
  • 提及实体框架的确切版本总是很重要的。请添加适当的标签。
  • @user2785460 _dbanimals 是什么? full 异常文本是什么,包括调用堆栈?只有当您尝试在 LINQ to 对象中使用 EF 函数时,才会抛出您发布的错误。 ToDataSourceResult 内部是否抛出异常?这个方法从何而来?

标签: c# sql linq


【解决方案1】:

这可能是由于您使用两个局部变量作为参数调用该函数,因此它在查询数据库之前正在评估客户端,从而导致错误。

【讨论】:

  • 如果在正确的环境(如 EF6)中使用,此函数与局部变量完美配合。在发布试探性答案之前运行一个小测试并没有什么坏处。
【解决方案2】:

正如 Moho 指出的那样,startend 都是已知的,不需要成为查询的一部分。实体框架可能会在编译查询时尝试评估表达式,而不是将其构建到查询中。如果这确实是您想要做的,请考虑通过将您的表达式从查询中取出来进行优化。

DateTime begin = new DateTime(2021, 1, 1);
DateTime end = new DateTime(2022, 1, 1);
int yearsDifference = end.Year - begin.Year;

var dataSet = from e in _db.animals
              where e.age == 2 && yearsDifference < 2                                                        
              select e.AnimalType;

或者更进一步:

DateTime begin = new DateTime(2021, 1, 1);
DateTime end = new DateTime(2022, 1, 1);
int yearsDifference = end.Year - begin.Year;

var dataSet = yearsDifference < 2
    ? Array.Empty<AnimalType>().AsQueryable()
    : from e in _db.animals
      where e.age == 2                                                       
      select e.AnimalType;

【讨论】:

  • 在这种情况下,没有理由在查询中输入yearsDifference &lt; 2,结果是已知的。
  • @PanagiotisKanavos:同意。我添加了另一个例子来表明这一点。看起来这是一个奇怪的用例,可能还有更优化的方法来处理它。
  • 如上所述,在正确的环境中,如 EF6,此函数与局部变量完美配合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多