#c# #stored-procedures #entity-framework-6
#c# #хранимые процедуры #сущность-фреймворк-6 #entity-framework-6
Вопрос:
У меня есть хранимая процедура, которая обеспечивает различный результат в зависимости от предоставленного входного параметра. Мне нужно выполнить процедуру и преобразовать результат в таблицу данных для отображения в таблице. Как я могу это сделать? Нужно ли мне создавать модель для всех результатов или есть какой-то общий способ сделать это?
--There are lots of report type. Just listed 2 of them for now
CREATE PROCEDURE [dbo].[uspGetAdminReportData]
@reportType VARCHAR(50)
AS
BEGIN
IF(@reportType = 'TOTAL_BY_DATE')
BEGIN
SELECT CONVERT(VARCHAR, DATE_SENT, 111) AS Date_Sent, FORMAT(DATE_SENT, 'dddd') AS Day_Of_Week, COUNT(*) AS Email_Count FROM TBLDATA1 WITH(NOLOCK) GROUP BY DATE_SENT
END
ELSE IF (@reportType = 'USER_LOGIN_LOGOUT_REPORT')
BEGIN
SELECT UserName, CONVERT(VARCHAR(10), [LOGIN], 111) AS LOGIN_DATE, CONVERT(VARCHAR(3),(SUM(DATEDIFF(MINUTE,[LOGIN],[LOGOUT]))/60)) ':' RIGHT('00' CONVERT(VARCHAR(3),(SUM(DATEDIFF(MINUTE,[LOGIN],[LOGOUT])) - (SUM(DATEDIFF(MINUTE,[LOGIN],[LOGOUT]))/60) * 60)),2) AS TOTAL_TIME FROM USERAUDIT WITH(NOLOCK)
INNER JOIN
UserRecords WITH(NOLOCK) ON UserAudit.UserId = UserRecords.UserId
Where DateDiff(Minute, [Login], [LOGOUT]) > 0
GROUP BY UserRecords.UserName, CONVERT(VARCHAR(10), [LOGIN], 111)
ORDER BY UserRecords.UserName, CONVERT(VARCHAR(10), [LOGIN], 111)
END
END
C# code
public virtual DataTable GetAdminReportData(ReportType reportType)
{
//not sure how to get the result executing the procedure for various report types. Need to execute the procedure, and cast the result as a data table and return to load table to the grid using entity framework
SqlParameter ReportType = new SqlParameter("reportType", reportType.ToString());
var result = this.Database.SqlQuery<object>("uspGetAdminReportData @reportType", ReportType);
}
Комментарии:
1. Рассматривали ли вы возможность изменения сохраненной процедуры с помощью
IF
вместо этого на две разные сохраненные процедуры? Ваша жизнь будет намного проще, если вы это сделаете.2. У вас должно быть две разные хранимые процедуры, сопоставьте их обе с некоторым типом сущности в EF и вызывайте их из C # на основе значения параметра. EF не преобразует выходные данные хранимой процедуры в DataTable. Он преобразует его в коллекцию сопоставленного типа сущности. Ваша хранимая процедура возвращает разные данные на основе значения параметра, вы не можете использовать его из EF.
3. Я создал отдельную хранимую процедуру и модель для каждого типа отчета. Я считаю, что это простой выход.