好吧,我认为尝试理解别人的SQL可以尝试足够但是尝试将所述SQL转换为实体框架是另一个难度......
我有这个SQL:
SELECT
MAX(IntegerColumn) - MIN(IntegerColumn)
/
DateDiff(day, MIN(DateColumn) , MAX(DateColumn))
*
DateDiff(day, MAX(DateColumn) , @TargetDate)
+
MAX(IntegerColumn)
AS Calculation
FROM MyTable
WHERE TargetId = @TargetId
忘记运算符优先级,到目前为止,我已经提出了以下LINQ to Entities,我对此极为怀疑:
var calculation =
(from f in this.ObjectContext.MyTable
where f.TargetId == targetId
group f by f.IntegerColumn into o
let maxIntegerColumn = o.Max(x => x.IntegerColumn)
let minIntegerColumn = o.Min(x => x.IntegerColumn)
let maxDate = (from t in o select t.DateColumn).Max()
let minDate = (from t in o select t.DateColumn).Min()
select new
{
Result = (maxIntegerColumn - minIntegerColumn) /
((SqlFunctions.DateDiff("day", minDate, maxDate) *
SqlFunctions.DateDiff("day", maxDate, targetDate)) + maxIntegerColumn)
}).FirstOrDefault();
if (calculation != null)
{
if (calculation.Result != null)
{
return calculation.Result.ToString();
}
}
这看起来是错误的,错误的,错误的,并且是盲目关注过多博客文章的结果。
这是正确的方向吗?如何简化正在进行的工作?
答案 0 :(得分:1)
如果有效,请继续使用。您可以重新格式化和重构LINQ,使其看起来更漂亮,但看起来它似乎正在做正确的事情。
在这种情况下,我可能会编写一个存储过程 - 您正在执行需要在数据库中完成的笨拙计算,因此只需将它们写入数据库,然后从代码中执行它们。
答案 1 :(得分:0)
您可以运行LINQ查询并观察生成的sql(通过Sql Server Profiler或任何第三方分析器)并确定它是否生成了确切的sql或至少是您需要的。
如果我在你的鞋子里,我可能会创建一个存储过程,接受2个值作为参数,并从实体框架调用它。 linq查询不是真的可读......:)