在我使用splitOn param之后仍然得到异常

时间:2017-04-27 15:48:12

标签: c# asp.net sql-server orm dapper

我有Event Class,它引用了2个对象Location和Category。

我编写了我的SQL查询字符串,它工作正常,但是当我把查询放在dapper中时,ORM.VS告诉我,我有一个内部异常。即使我使用了splitOn param,我仍然会得到异常。

注意:我们使用RecordID作为col的名称key col,用于下面的表Event,EventLocation和EventCategory。那是问题吗?

  

发生System.ArgumentException HResult = 0x80070057 Message = When   使用多映射API确保您设置splitOn参数   拥有Id以外的密钥

      public IEnumerable<Event> SelectEventsForList()
        {
            // using (var db = new )

            var queryStr = @"SELECT 
                            e.RecordID
                            ,e.Title
                            ,e.Description [Description]
                            ,e.Location  [LocationDetails]
                            ,e.RegistrationRequired AS [IsRegistrationRequired]
                            ,e.StartDate AS [EventDate]
                            ,e.StartDate
                            ,e.EndDate
                            ,e.MaximumRegistrants
                            ,eloc.RecordID
                            ,eloc.DisplayName
                            ,eloc.DisplayColour
                            ,ecat.RecordID
                            ,eCat.DisplayName
                            ,eCat.DisplayColour
                            FROM dbo.Event e INNER JOIN dbo.EventLocation eloc ON e.LocationId = eloc.RecordID
                            INNER JOIN dbo.EventCategory eCat ON e.CategoryID = ecat.RecordID
                            WHERE eCat.Deleted = 0";

            return this.dbConnection.Query<Event, Location, Category, Event>(
queryStr, (e, l, c) => { 
e.Location = l; e.Category = c; return e; 
},splitOn: "eloc.RecordID,ecat.RecordID");
        }

1 个答案:

答案 0 :(得分:0)

如果在select子句中写入表名。列名,则结果集中的列名将不包含表名。例如:

select eloc.RecordId 
from dbo.EventLocation eloc

返回的列名将为RecordId

因此,您应该使用splitOn:“ RecordId,RecordId”。

Dapper向后浏览结果集中的列,因此它应该找到查询返回的第二和第三RecordId列。