C#与泛型方法的简洁一对多关系

C#与泛型方法的简洁一对多关系,c#,dapper,C#,Dapper,我有两个这样的模型 public class TeacherModel { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public IEnumerable<Class> Classes { get; set; } } public class ClassModel { pu

我有两个这样的模型

public class TeacherModel
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public IEnumerable<Class> Classes { get; set; }
}   

public class ClassModel
{
    public int Id { get; set;}
    public int numOfStudents { get; set;}
}
公共类教师模型
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共IEnumerable类{get;set;}
}   
公共类模型
{
公共int Id{get;set;}
公共整数{get;set;}
}
我还有一个选择所有记录的存储过程。 我的问题是如何将dapper与泛型结合使用。在一般情况下,我使用这种通用方法

public List<T> LoadData<T, U>(string storedProcedure, U parameters, string connectionStringName)
{
     var connectionString = GetConnectionString(connectionStringName);

     using (IDbConnection connection = new SqlConnection(connectionString))
     {
         var list = connection.Query<T>(storedProcedure, parameters,
             commandType: CommandType.StoredProcedure).ToList();

        return list;
     }
 }
公共列表加载数据(字符串存储过程、U参数、字符串连接字符串名称)
{
var connectionString=GetConnectionString(connectionStringName);
使用(IDbConnection连接=新的SqlConnection(connectionString))
{
var list=connection.Query(存储过程、参数、,
commandType:commandType.StoredProcess.ToList();
退货清单;
}
}
现在,由于一对多的关系,我尝试使用这种通用方法,但没有成功

public List<T> LoadMultipleData<T, L, U>(string storedProcedure, T parentModel, L childModel, U parameters, string connectionStringName)
{
     var connectionString = GetConnectionString(connectionStringName);

     using (IDbConnection connection = new SqlConnection(connectionString))
     {
         var list= connection.Query<T, U, T>(storedProcedure, 
                                         (parent, child) =>
                                          {
                                             parent.parentModel = child;
                                             return parent;
                                          },
                                          parameters,
                commandType: CommandType.StoredProcedure).ToList();

         return list;
     }
 }
public List LoadMultipleData(字符串存储过程、T父模型、L子模型、U参数、字符串连接字符串名称)
{
var connectionString=GetConnectionString(connectionStringName);
使用(IDbConnection连接=新的SqlConnection(connectionString))
{
var list=connection.Query(StoredProcess,
(父母、子女)=>
{
parent.parentModel=child;
返回父母;
},
参数,
commandType:commandType.StoredProcess.ToList();
退货清单;
}
}
正确的方法是什么?

这个怎么样:

public List LoadMultipleData(字符串存储过程、T父模型、L子模型、U参数、字符串连接字符串名称)
{
var connectionString=GetConnectionString(connectionStringName);
使用(IDbConnection连接=新的SqlConnection(connectionString))
{
var parents=newdictionary();
var list=connection.Query(StoredProcess,
(父母、子女)=>
{
发现父母;
如果(!parents.TryGetValue(parent.id,out foundParent))
{
foundParent=父母;
添加(foundParent.id,foundParent);
} 
foundParent.parentModel=child;
返回父母;
},
参数,
commandType:commandType.StoredProcess.ToList();
return list.Distinct();//如果愿意,也可以返回parents。
}
}

如果字段名为“Id”,则不需要
splitOn
参数。您应该记住,任何联接都会返回一个二维“表”,并且父项(联接的左侧)将与它们有子项的次数相乘。这就是为什么您需要parents dictionary来记录它是“新”父级还是现有父级的原因。

请注意:Dapper在多重映射查询中使用“splitOn”,因此它可以判断对象的结束位置和另一个对象的开始位置,但不确定您是否在SP上正确执行此操作,但很明显,这不是在简洁的方面做的,这只是我的问题,或者这段代码甚至都没有编译<代码>T不包含id的定义。