帮助将SQL转换为LINQ到实体

时间:2011-09-23 01:38:46

标签: c# linq entity-framework linq-to-entities

好吧,我认为尝试理解别人的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();
    }
}

这看起来是错误的,错误的,错误的,并且是盲目关注过多博客文章的结果。

这是正确的方向吗?如何简化正在进行的工作?

2 个答案:

答案 0 :(得分:1)

如果有效,请继续使用。您可以重新格式化和重构LINQ,使其看起来更漂亮,但看起来它似乎正在做正确的事情。

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

答案 1 :(得分:0)

您可以运行LINQ查询并观察生成的sql(通过Sql Server Profiler或任何第三方分析器)并确定它是否生成了确切的sql或至少是您需要的。

如果我在你的鞋子里,我可能会创建一个存储过程,接受2个值作为参数,并从实体框架调用它。 linq查询不是真的可读......:)