Оптимизированная хранимая процедура для замены этого оператора LINQ - PullRequest
0 голосов
/ 26 февраля 2011

У меня есть следующие две таблицы в SQL Server 2008

TABLE [JobUnit](
    [idJobUnit] [int] IDENTITY(1,1) NOT NULL,
    [Job_idJob] [int] NOT NULL,  // Foreign key here
    [UnitStatus] [tinyint] NOT NULL, // can be (0 for unprocessed, 1 for processing, 2 for processed)   
    )

TABLE [Job](
    [idJob] [int] IDENTITY(1,1) NOT NULL,
    [JobName] [varchar(50)] NOT NULL,   
    )

Job: JobUnit - это отношение один-ко-многим

Я пытаюсь написать эффективную процедуру хранения, которая заменитследующее утверждение LINQ

public enum UnitStatus{
    unprocessed,
    processing,
    processed,
}

int jobId = 10;

using(EntityFramework context = new EntityFramework())
{
    if (context.JobUnits.Where(ju => ju.Job_idJob == jobId)
        .Any(ju => ju.UnitStatus == (byte)UnitStatus.unproccessed))
    {
        // Some JobUnit is unprocessed
        return 1;
    }
    else
    {
        // There is no unprocessed JobUnit
        if (context.JobUnits.Where(ju => ju.Job_idJob == jobId) //
            .Any(ju => ju.UnitStatus == (byte)UnitStatus.processing))
        {                   
            // JobUnit has some unit that is processing, but none is unprocessed 
            return 2;
        }
        else
        {
            // Every JoUnit is processed
            return 3;
        }
    }
}

Спасибо за чтение

1 Ответ

1 голос
/ 26 февраля 2011

Так что, на самом деле, вы просто ищете самое низкое состояние всех юнитов в конкретной работе?

CREATE PROCEDURE GetJobState @jobId int AS
SELECT MIN(UnitStatus)
FROM JobUnit 
WHERE Job_idJob = @jobId

Я должен также сказать, что вы можете использовать этот подход так же легко в Linq.

...