linq и хранимые процедуры - PullRequest
1 голос
/ 25 февраля 2011

Я пытаюсь выполнить хранимую процедуру в LINQ. При запуске в SQL Server он возвращает несколько полей, в основном целочисленные и плавающие. Но когда я вызываю хранимую процедуру в LINQ, она возвращает только 0. Вот как я вызываю хранимую процедуру:

var meterReadings = _database.MetricDataReport("20101127");

А вот и сохраненный процесс:

ALTER PROCEDURE [dbo].[MetricDataReport]
@FormDate VARCHAR(8)
AS
SET NOCOUNT ON  



/*Table To Hold Finished RecordSet*/
CREATE TABLE #OutputTable
(
    PkMetricMeterID INT,
    FkSiteID        INT,
    FourWeekReading FLOAT,
    LastWeekReading FLOAT,
    ThisWeekReading FLOAT,
    pkMeterID       INT,
    DecimalPlaces   INT

)

CREATE TABLE #WorkingTable
(
    PkMetricMeterID INT,
    FkSiteID        INT,
    FormDate        DATETIME,
    Reading         FLOAT,
    pkMeterID       INT,
    DecimalPlaces   INT
)   

-----------------------------------
---   Process Physical Meters   ---
-----------------------------------
    INSERT INTO #WorkingTable (PkMetricMeterID,FkSiteID,FormDate,Reading,pkMeterID,DecimalPlaces)
    SELECT
        luMetricMeters.PkMetricMeterID,
        LuMetricMeterList.FkSiteID,
        GetReadingsAndPriceLite.FormDate,
        GetReadingsAndPriceLite.CalculatedConsumption * GetReadingsAndPriceLite.ConversionFactor,
        luMetricMeterList.pkMeterID,            
        Meters.DecimalPlaces    
    FROM
        luMetricMeters 
    INNER JOIN
        luMetricMeterList ON luMetricMeterList.PkMetricMeterID = luMetricMeters.PkMetricMeterID
    INNER JOIN  
        GetReadingsAndPriceLite ON GetReadingsAndPriceLite.pkMeterID = luMetricMeterList.pkMeterID
    INNER JOIN
        Meters ON Meters.PkMeterID = luMetricMeterList.pkMeterID
    WHERE
        GetReadingsAndPriceLite.FormDate <= @FormDate AND GetReadingsAndPriceLite.FormDate >= DATEADD(wk,-4,@FormDate)
--------------------------------------------
---   Process Virtual Meters (NON KPI)   ---
--------------------------------------------

---Check To See If Meter Needs Updating
DECLARE @CurrentMeterID INT
DECLARE MeterCursor Cursor FAST_FORWARD FOR
    SELECT 
        luMetricMeterList.pkMeterID
    FROM
        LuMetricMeters 
    INNER JOIN
        luMetricMeterList ON luMetricMeterList.PkMetricMeterID = luMetricMeters.PkMetricMeterID
    INNER JOIN
        VirtualMeterReadings ON VirtualMeterReadings.MeterID = luMetricMeterList.pkMeterID
    WHERE
        VirtualMeterReadings.UpdateFlag = 1
OPEN MeterCursor
FETCH NEXT FROM MeterCursor INTO @CurrentMeterID
WHILE @@Fetch_Status=0
BEGIN
    EXEC UpdateVirtualReadings @CurrentMeterID
    FETCH NEXT FROM MeterCursor INTO @CurrentMeterID
END
CLOSE MeterCursor
DEALLOCATE MeterCursor


INSERT INTO #WorkingTable (PkMetricMeterID,FkSiteID,FormDate,Reading,pkMeterID,DecimalPlaces)
    SELECT
        luMetricMeters.PkMetricMeterID,
        LuMetricMeterList.FkSiteID,
        VirtualMeterReadings.FormDate,
        VirtualMeterReadings.Reading,
        LuMetricMeterList.pkMeterID,
        Meters.DecimalPlaces            
    FROM
        luMetricMeters 
    INNER JOIN
        luMetricMeterList ON luMetricMeterList.PkMetricMeterID = luMetricMeters.PkMetricMeterID
    INNER JOIN  
        VirtualMeterReadings ON VirtualMeterReadings.MeterID = luMetricMeterList.pkMeterID
    INNER JOIN
        Meters ON Meters.PkMeterID = luMetricMeterList.pkMeterID
    WHERE
        VirtualMeterReadings.FormDate <= @FormDate AND VirtualMeterReadings.FormDate >= DATEADD(wk,-4,@FormDate)

SET NOCOUNT OFF

SELECT DISTINCT
    [#WorkingTable].PkMetricMeterID,
    #WorkingTable.FkSiteID,
    ThisWeekReading = (SELECT TOP 1 Reading FROM #WorkingTable WorkingTable1 WHERE WorkingTable1.PkMetricMeterID = #WorkingTable.PkMetricMeterID AND [#WorkingTable].FkSiteID = [WorkingTable1].FkSiteID ANd workingTable1.FORMDATE = @FormDate),
    LastWeekReading = (SELECT TOP 1 Reading FROM #WorkingTable WorkingTable1 WHERE WorkingTable1.PkMetricMeterID = #WorkingTable.PkMetricMeterID AND [#WorkingTable].FkSiteID = [WorkingTable1].FkSiteID ANd workingTable1.FORMDATE = DATEADD(d,-7,@FormDate)),
    FourWeekReading = (SELECT AVG(Reading) FROM #WorkingTable WorkingTable1 WHERE WorkingTable1.PkMetricMeterID = #WorkingTable.PkMetricMeterID AND [#WorkingTable].FkSiteID = [WorkingTable1].FkSiteID),
    #WorkingTable.pkMeterID,
    #WorkingTable.DecimalPlaces
FROM
    [#WorkingTable]
ORDER BY    
    [#WorkingTable].PkMetricMeterID,
    [#WorkingTable].FkSiteID

1 Ответ

0 голосов
/ 25 февраля 2011

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

Кроме того, обратите внимание на сообщение в блоге ScottGu об использовании сохраненных процедур с Linq to Sql.

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