EF на IDBcommandInterceptor и DBDataReader

Я пытаюсь издеваться над EF IDBcommandInterceptorДля операций вставки / обновления это достаточно просто - я могу вернуть DbDataReader сделанный из единственного поля или целого числа. Однако, для операций выбора, если есть некоторые "включения", тогда форма результата sql довольно... удивительная

Как я могу получить от

ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> поля и имена и соответствующие объекты для DbDataReader результат?

Спасибо,

Пример: пытаюсь прочитать Department(Id, Name) from Id with include on Employee(Id, Name .IDDepartment, DateModification, DateCreation, User)Команда, которая получает DBDataReader для включения, приведена ниже.

Я хочу знать имена полей (например, C1, ID1, Name1 и другие) быть способным к насмешкам.

SELECT 
    [Project2].[Id] AS [Id], 
    [Project2].[Name] AS [Name], 
    [Project2].[C1] AS [C1], 
    [Project2].[Id1] AS [Id1], 
    [Project2].[Name1] AS [Name1], 
    [Project2].[IDDepartment] AS [IDDepartment], 
    [Project2].[DateModification] AS [DateModification], 
    [Project2].[DateCreation] AS [DateCreation], 
    [Project2].[User] AS [User], 
    [Project2].[Archive] AS [Archive]
    FROM ( SELECT 
        [Limit1].[Id] AS [Id], 
        [Limit1].[Name] AS [Name], 
        [Extent2].[Id] AS [Id1], 
        [Extent2].[Name] AS [Name1], 
        [Extent2].[IDDepartment] AS [IDDepartment], 
        [Extent2].[DateModification] AS [DateModification], 
        [Extent2].[DateCreation] AS [DateCreation], 
        [Extent2].[User] AS [User], 
        [Extent2].[Archive] AS [Archive], 
        CASE WHEN ([Extent2].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
        FROM   (SELECT TOP (1) 
            [Extent1].[Id] AS [Id], 
            [Extent1].[Name] AS [Name]
            FROM [dbo].[Department] AS [Extent1]
            WHERE [Extent1].[Id] = @p__linq__0 ) AS [Limit1]
        LEFT OUTER JOIN [dbo].[Employee] AS [Extent2] ON [Limit1].[Id] = [Extent2].[IDDepartment]
    )  AS [Project2]
    ORDER BY [Project2].[Id] ASC, [Project2].[C1] ASC

1 ответ

Вы должны быть в состоянии получить имена столбцов от читателя, делая что-то вроде этого

var columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();

Что в случае вам нужны только имена. Если вы получите всю схему для таблицы результатов, вы можете получить ее, выполнив это:

DataTable schemaTable = reader.GetSchemaTable();

Затем выполните итерацию по коллекции строк в таблице данных, чтобы получить свойства каждого столбца.

Это помогает ответить на ваш вопрос?

Другие вопросы по тегам