问题描述
***错误***
使用多重映射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表达式中的复杂逻辑。