Как вернуть несколько строк с каркасом сущностей и последовательно читать их по нескольким потокам

У меня есть временный ряд, загруженный в SQL Server, который мне нужно запросить, а затем разрешить нескольким задачам последовательно читать результаты из моего SProc.

Из того, что я нашел в google, представляется возможным выполнить запросы SProc или LINQ. Im, в настоящее время не знакомый с LINQ (предпочтение отдается SProc). Есть ли преимущество одного над другим?

Как я могу получить доступ к данным последовательным образом после выполнения SProc? Я предполагаю, что SProc просто изменит мой ObjectContext. Если это так, нужна ли мне каждая задача, чтобы подсчитывать, к какой строке она была, а затем доступ к каждому параметру ObjectContext с помощью этого счетчика, чтобы получить требуемое значение?

Ниже приведен код SProc:

CREATE PROCEDURE [dbo].[DataRetrieval]
    @StartTime      Time(0)     ='00:00:00',
    @EndTime        Time(0)     ='00:00:00',
    @StartDate      Date        ='2012-01-01',
    @EndDate        Date        ='2012-01-01',
    @Location           nchar(6)    ='Scotland'
AS
/*
Author: Hans
Date: 09-01-2013
Purpose: Used to load a large section of data into memory.
*/
SET NOCOUNT ON;
BEGIN

SELECT *
FROM 
    dbo.Data
WHERE
    LOCATION = @Location
    AND ( Date = @StartDate  AND Time >= @StartTime
               OR Date > @StartDate )
    AND ( Date = @EndDate  AND Time < @EndTime
               OR Date < @EndDate )
ORDER BY
    DATE, TIME
END

EDIT для USR                 ...

            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = "dbo.Data_GetStoredProcedureList";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandTimeout = 10;
                cmd.Connection = connection;

                try
                {
                    connection.Open();

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader != null && reader.HasRows)
                        {
                            cancelTask.ThrowIfCancellationRequested();

                            while (reader.Read())
                            {
                                Entity rowData = new Entity();
                                rowData.RoutineName = reader["Routine_Name"].ToString();
                                rowData.ParameterName = reader["Parameter_Name"].ToString();
                                rowData.DataType = reader["Data_Type"].ToString();

                                sProcListRetrieval.Results.Add(rowData);
                            }
                        }
                    }
                }
0
добавлено отредактировано
Просмотры: 2
nl ja de
Вы хотите, чтобы каждый поток прочитал все строки или достигнет потока для чтения (возможно, случайного) подмножества из них?
добавлено автор usr, источник
Сколько строк есть? Не могли бы вы их скопировать в List ?
добавлено автор usr, источник
Привет, я хочу, чтобы каждый поток последовательно просматривал все строки, которые были возвращены из SProc. Этот процесс, последовательно просматривающий строки, будет выполняться несколько раз.
добавлено автор Hans Rudel, источник
Пару миллионов.
добавлено автор Hans Rudel, источник

1 ответы

Вы можете легко скопировать несколько миллионов объектов в память. Буферируйте результаты T-SQL в List и передайте этот список вашим рабочим потокам.

1
добавлено
Это полностью зависит от того, как вы называете proc. Вероятно, достаточно позвонить в ToList . Если вы опубликуете код, как вы его назовете в данный момент, я буду смотреть на него.
добавлено автор usr, источник
Похоже, вы уже имеете список и добавляете к нему. Что в этом плохого? Разве ты не можешь так сделать?
добавлено автор usr, источник
Не могли бы вы рассказать о том, как выполнить SProc/buffer результаты в список? +1 за помощь ур до сих пор :)
добавлено автор Hans Rudel, источник
ive добавил код, который я использовал в предыдущем проекте, чтобы вернуть список SProcs перед добавлением результатов в пользовательский объект. Это только delt с небольшим количеством строк.
добавлено автор Hans Rudel, источник