Еще одна проблема сводки LINQ - конвертировать SQL-скрипт в LINQ - PullRequest
3 голосов
/ 08 декабря 2008

На SO уже есть несколько вопросов, касающихся стержней LINQ, и хотя некоторые из них обрисовывают мою точную проблему, я не могу успешно перевести их в рабочее решение. Я чувствую, что это в основном из-за объединения в моих таблицах.

Так что для всех наркоманов LINQ, которым нравится проблема, вот еще одна загадка для вас. Пожалуйста, помогите мне (и заработайте несколько очков репутации и большое уважение от меня), преобразовав следующий хранимый сценарий SQL в LINQ:

ALTER PROCEDURE [dbo].[GetTimesheetForWeekById]
    @timesheetid int,
    @begindate VarChar(20),
    @enddate VarChar(20)
AS
BEGIN

    SELECT T.TaskName,
        SUM(
            case DATEPART(weekday, TE.StartTime)
                WHEN 1 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
            ) AS Sunday,
        SUM(
            case DATEPART(weekday, TE.StartTime)
                when 2 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
            ) AS Monday,
        SUM(
            case DATEPART(weekday, TE.StartTime)
                when 3 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
            ) AS Tuesday,
        SUM(
            case DATEPART(weekday, TE.StartTime)
                when 4 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
            ) AS Wednesday,
        SUM(
            case DATEPART(weekday, TE.StartTime)
                when 5 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
            ) AS Thursday,
        SUM(
            case DATEPART(weekday, TE.StartTime)
                when 6 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
            ) AS Friday,
        SUM(
            case DATEPART(weekday, TE.StartTime)
                when 6 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
            ) AS Saturday

    FROM Tasks T
    INNER JOIN TimeEntries TE on T.TaskID = TE.TaskID
    WHERE TE.StartTime BETWEEN 
        (CONVERT(datetime, @begindate, 103)) AND (CONVERT(datetime, @enddate, 103))
    AND TE.TimesheetID = @timesheetid
    GROUP BY T.TaskName
END

Ответы [ 2 ]

1 голос
/ 03 июня 2009

Как это (изменение Марка):

var qry = from timeEntry in timeEntries
      let date = timeEntry.StartTime.Date
      where timeEntry.TimesheetId == timesheetId
      && date >= start
      && date <= end
      group timeEntry by timeEntry.Task.TaskName into grp
      select new
      {
          TaskName = grp.Key,
          Monday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Monday)
                   .Sum(x=>x.EndTime.Subtract(x.StartTime).TotalMinutes),
          Tuesday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Tuesday)
                    .Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes),
          Wednesday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Wednesday)
                      .Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes),
          Thursday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Thursday)
                     .Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes),
          Friday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Friday)
                   .Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes),
      };
1 голос
/ 08 декабря 2008

Хорошо, если предположить, что внешний ключ имеет объектное представление, что-то вроде:

        int timesheetId = ...
        DateTime start = ..., end = ...
        var qry = from timeEntry in ctx.TimeEntries
              let date = timeEntry.StartTime.Date
              where timeEntry.TimesheetId == timesheetId
                && date >= start
                && date <= end
              group timeEntry by timeEntry.Task.TaskName into grp
              select new {
                  TaskName = grp.Key,
                  Monday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Monday).Count(),
                  Tuesday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Tuesday).Count(),
                  Wednesday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Wednesday).Count(),
                  Thursday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Thursday).Count(),
                  Friday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Friday).Count()
              };

К сожалению, некоторые особенности зависят от поставщика SQL - то есть, какие функции (например, DayOfWeek и т. Д.) Могут успешно отображаться как TSQL. Дайте мне знать, если возникнут проблемы ...

...