将SQL翻译为LINQ-to-Entities的帮助

3

我认为尝试理解别人的SQL已经够难了,但是尝试将该SQL转换为Entity Framework则是另一种痛苦的境地...

这是我的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();
    }
}

这看起来完全不对,是盲目跟随太多博客文章的结果。

这是正确的方向吗?我该如何简化正在发生的事情?


它是否给出了正确的结果? - Kirk Broadhurst
2个回答

1

如果它能工作,那就用它。你可以重新格式化和重构你的LINQ使它看起来更漂亮,但似乎它正在做正确的事情。

在这种情况下,我可能会编写一个存储过程 - 你正在执行需要在数据库中完成的笨拙计算,所以只需在数据库中编写它们,然后从你的代码中执行它们。


0

你可以运行LINQ查询并观察生成的SQL(通过Sql Server Profiler或任何第三方分析工具),然后决定它是否生成了准确的SQL,或者至少是你需要的。

如果我是你的话,我可能会创建一个接受这两个值作为参数的存储过程,并从实体框架调用它。LINQ查询并不容易阅读... :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接