2014-09-25 49 views
1

我試圖模擬EF上IDBcommandInterceptor 對於插入/更新操作是很簡單 - 我可以返回由單場的DbDataReader或int 然而,對於選擇操作,如果有一些「有」,那麼SQL結果的形狀是相當... 真棒EF上IDBcommandInterceptor和DBDataReader

我怎麼會從

ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader>領域和名稱,爲DbDataReader結果對應的實體獲得?

謝謝

例子:試圖讀取Department(Id, Name) from Id with include on Employee(Id, Name .IDDepartment, DateModification, DateCreation, User) 是獲得DBDataReader爲包括低於該命令。

我想知道字段名稱(如C1ID1,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 

回答

0

你應該能夠做這樣的事情

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

獲得來自讀取器的列名的情況下,你只需要姓名。如果你得到的結果表的整個架構,您可以通過這樣做,得到它:

DataTable schemaTable = reader.GetSchemaTable(); 

然後通過在數據錶行的集合迭代獲得每個列的屬性。

這有助於回答你的問題嗎?

+0

你在這裏說什麼是如何將IDataReader轉換爲數據表。請再讀一遍這個問題 - 我沒有IDataReader - 我也不想將DbCommand運行到數據庫。 – ignatandrei 2014-10-08 02:50:45