Dapper-多映射API确保您设置splitOn

问题描述

对于下面显示代码,我收到以下错误消息。

***错误***

使用多重映射API时,请确保在以下情况下设置splitOn参数 您除了ID(参数'splitOn')以外还有其他键

据我了解,我正在传递splitOn参数,我是否缺少明显的东西?

代码


 using (var connection = new Microsoft.Data.sqlClient.sqlConnection(connectionString))
                {
                    connection.open();
                    LookupTables = connection.Query<LookupTable,List<LookupValue>,LookupTable>("exec [lookups].[SelAllLookupTable]",(lookuptable,lookupvalue) => {
                            lookuptable.LookUpValues = lookupvalue.ToList<LookupValue>(); 
                            return lookuptable;
                        },splitOn: "LookupValueID").ToList();
                }


更新

存储的验证码


ALTER PROCEDURE [lookups].[SelAllLookupTable]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT lt.[LookupTableID],lt.[GUID],lt.[CreatedBy],lt.[CreatedOn],lt.[UpdatedBy],lt.[UpdatedOn],lt.[ChangeReason],lt.[Name],lt.[Description],lv.[LookupValueID],lv.[LookupTableID],lv.[GUID],lv.[CreatedBy],lv.[CreatedOn],lv.[UpdatedBy],lv.[UpdatedOn],lv.[ChangeReason],lv.[Description],lv.[displayOrderNo]
    FROM lookups.LookupTable lt
    LEFT JOIN lookups.LookupValue lv ON lt.LookupTableID = lv.LookupTableID
END


解决方法

我没有您的数据,但我认为您应该以这种方式更改代码

// Where we store the distinct LookUpTable found by the query
Dictionary<int,LookUpTable> result = new Dictionary<int,LookUpTable>();

using (var connection = new Microsoft.Data.SqlClient.SqlConnection(connectionString))
{
    connection.Open();
    var LookupTables = connection.Query<LookupTable,LookUpValue,LookupTable>("exec [lookups].[SelAllLookupTable]",(lkt,lkv) =>
        {
            // Check if we have the instance already in the dictionary
            // add it if not,if (!result.ContainsKey(lkt.LookUpTableID))
               result.Add(lkt.LookUpTableID,lkt);
            result[lkt.LookupTableID].LookUpValues.Add(lkv);
            return lkt;
        },splitOn: "LookupValueID").ToList();
}
return result.Values.ToList();

Dapper不会直接构建并传递一个LookUpValue列表,但是它将遍历所有从返回的记录创建对象的记录,并将这些对象一一传递给lambda表达式。
您的lambda表达式可以使用Dictionary存储收到的每个LookupTable对象,并将LookupValue对象添加到其属性。当Dapper在记录上结束迭代时,您的对象将存储在字典的Values集合中

当然,这假定您的类LookUpTable具有List<LookUpValue>属性

public class LookupTable
{
    public int LookupValueID { get; set; }
    .... other properties ....
    public List<LookUpValue> LookUpValues {get;set} = new List<LookUpValue>();
}

请注意,该属性如何在初始化时创建列表,以避免Dapper lambda表达式中的复杂逻辑。