Преобразование SQL в Linq - PullRequest
0 голосов
/ 25 июля 2011

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

запрос, который я пытаюсь преобразовать ... может теперь обрабатывать foreach в моем коде c #, так что если это оставить, то больше вложенных выборок и IN, которые меня вызывают

DECLARE @Begin DateTime, @End DateTime, @date DateTime, @partnerId int

Set @partnerId = 1
Set @Begin = Cast('2010-01-01' as DateTime)
Set @End = Cast(Dateadd(month, 17, @Begin) as DateTime)
Set @date = @Begin

SET NOCOUNT ON
WHILE (@date <= @End)
BEGIN
    SELECT
        [PackageId],
        @date AS [Date],
        [Name],
        (ISNULL((SELECT [ReportId] FROM [Uniferon_Reports] WHERE [FK_PartnerId] = @partnerId AND [FK_PackageId] = [Uniferon_Packages].[PackageId] AND [Date] = @date), 0)) AS [ReportId],
        (ISNULL((SELECT [UnitsForecast] FROM [Uniferon_Reports] WHERE [FK_PartnerId] = @partnerId AND [FK_PackageId] = [Uniferon_Packages].[PackageId] AND [Date] = @date), 0)) AS [UnitsForecast],
        (ISNULL((SELECT [UnitsActual] FROM [Uniferon_Reports] WHERE [FK_PartnerId] = @partnerId AND [FK_PackageId] = [Uniferon_Packages].[PackageId] AND [Date] = @date), 0)) AS [UnitsActual],
        (ISNULL((SELECT [RevenueForecast] FROM [Uniferon_Reports] WHERE [FK_PartnerId] = @partnerId AND [FK_PackageId] = [Uniferon_Packages].[PackageId] AND [Date] = @date), 0)) AS [RevenueForecast],
        (ISNULL((SELECT [RevenueActual] FROM [Uniferon_Reports] WHERE [FK_PartnerId] = @partnerId AND [FK_PackageId] = [Uniferon_Packages].[PackageId] AND [Date] = @date), 0)) AS [RevenueActual],
        (ISNULL((SELECT [UnitsInStock] FROM [Uniferon_Reports] WHERE [FK_PartnerId] = @partnerId AND [FK_PackageId] = [Uniferon_Packages].[PackageId] AND [Date] = @date), 0)) AS [UnitsInStock]
        FROM
            [Uniferon_Packages][Uniferon_Packages]
        WHERE
        [PackageId] IN 
        (SELECT [FK_PackageId] FROM [Uniferon_Partners_Packages_Relation] WHERE [FK_PartnerId] = @partnerId AND [StartDate] <= @date    AND ([EndDate] >= @date OR [EndDate] IS NULL))


Set @date = DateAdd(month, 1, @date)
END
SET NOCOUNT OFF   

есть мысли?

Ответы [ 4 ]

1 голос
/ 25 июля 2011

Доступен инструмент под названием Linqer , который может принимать ваши операторы SQL и преобразовывать их в функции lamba.Попробуйте и посмотрите, что это может дать.

0 голосов
/ 26 июля 2011

Вы можете взглянуть на LINQPad , который может помочь вам изучить LINQ и проверить правильность выражения LINQ.

0 голосов
/ 25 июля 2011

Как то так. Надеюсь, что это поможет вам понять LINQ более эффективным;):

while (date <= endDate)
{
    var result = Uniferon_Packages
        .Where(i => 
            Uniferon_Partners_Packages_Relation.Any(rel => rel.FK_PartnerId == i.PackageId) &&
            rel.StartDate <= date && (!rel.EndDate.HasValue || rel.EndDate >= date))
        .Select(i => new
                         {
                             i.PackageId,
                             i.Name,
                             Date = date,
                             ReportId = GetReportId(i, partnerId, date)
                             // etc...
                         });

    date = date.AddMonths(1);
}


private int GetReportId(Uniferon_Package pack, int partnerId, DateTime date)
{
    var report = Uniferon_Reports.FirstOrDefault(x => 
        x.FK_PartnerId == partnerId && 
        x.FK_PackageId == pack.PackageId && 
        x.Date == date);

    return report != null
        ? report.ReportId
        : 0;
}
0 голосов
/ 25 июля 2011

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

Однако имейте в виду, что если WHILE действительно необходим в SQL, то вы не сможете эффективно перенести это на клиентский код C # -если требуется цикл в базе данных, то может быть более оптимальным оставить этот код в SQL на стороне сервера.

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