Помощь по переводу SQL в LINQ-to-Entities - PullRequest
3 голосов
/ 23 сентября 2011

Ну, я думаю, что пытаться понять кого-то еще, 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();
    }
}

Это просто выглядит неправильно, неправильно, неправильно и являетсярезультат слепого отслеживания слишком большого количества сообщений в блоге.

Это в правильном направлении?Как я могу упростить то, что происходит?

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

Если это работает, иди с ним. Вы можете переформатировать и реорганизовать свой LINQ, чтобы он выглядел красивее, но кажется, что он делает все правильно.

В этом случае я бы, вероятно, написал хранимую процедуру - вы выполняете неуклюжие вычисления, которые необходимо выполнить в базе данных, поэтому просто запишите их в базу данных и затем выполните их из своего кода.

0 голосов
/ 23 сентября 2011

Вы можете запустить запрос LINQ и наблюдать за созданным sql (через Sql Server Profiler или любой сторонний профилировщик) и решить, генерирует ли он точный sql или хотя бы то, что вам нужно.

Если бы я был вВаши ботинки, я бы, вероятно, создал бы хранимую процедуру, которая принимает 2 значения в качестве параметров и вызывает их из структуры сущностей.Запрос linq не читается ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...