C# 用“Dapper.NET”填充一个类;“班级名单”;
我是Dapper.NET的新手,有点迷恋这个。我试图填充一个类,该类具有来自多行结果集中的另一个类 #数据库SP>C# 用“Dapper.NET”填充一个类;“班级名单”;,c#,.net,sql-server,dapper,C#,.net,Sql Server,Dapper,我是Dapper.NET的新手,有点迷恋这个。我试图填充一个类,该类具有来自多行结果集中的另一个类 #数据库SP> SELECT b.BuildingId, b.BuildingName, b.Wood, b.Food, b.Stone, b.Gold FROM UserBuildings ub, Buildings b WHERE b.BuildingId = ub.BuildingId AND UserId = @UserId #代码> }您的代码需要定义数据的分隔方式。使用GridRea
SELECT b.BuildingId, b.BuildingName, b.Wood, b.Food, b.Stone, b.Gold FROM UserBuildings ub, Buildings b WHERE b.BuildingId = ub.BuildingId AND UserId = @UserId
#代码>
}您的代码需要定义数据的分隔方式。使用
GridReader.Read的splitOn
参数
var buildings = new List<Building.Building>();
using (IDbConnection connection = OpenConnection())
{
using(var reader = connection.QueryMultiple("UserBuildingGet",
new { UserId = UserId },
commandType: CommandType.StoredProcedure))
{
var building = reader.Read<Building.Building,
Resource.Resource,
Building.Building>
((b, r) => { b.Resource = r; return b; }, splitOn: "Wood");
buildings.AddRange(building);
}
}
return buildings;
var buildings=新列表();
使用(IDbConnection=OpenConnection())
{
使用(var reader=connection.QueryMultiple(“UserBuildingGet”,
新的{UserId=UserId},
commandType:commandType.StoredProcess)
{
var building=reader.Read
((b,r)=>{b.Resource=r;返回b;},splitOn:“Wood”);
建筑物。AddRange(建筑物);
}
}
归还建筑物;
见:
样本:
public class Building
{
public int BuildingId { get; set; }
public string BuildingName { get; set; }
public Resource Resource { get; set; }
public override string ToString()
{
return string.Format("Id: {0} Name: {1} Resource: {2}", BuildingId, BuildingName, Resource);
}
}
public class Resource
{
public int Wood { get; set; }
public int Food { get; set; }
public int Stone { get; set; }
public int Gold { get; set; }
public override string ToString()
{
return string.Format("Wood: {0} Food: {1} Stone {2} Gold {3}", Wood, Food, Stone, Gold);
}
}
var sql = @"SELECT 1 AS BuildingId, 'tower' AS BuildingName, 1 AS Wood, 1 AS Food, 1 AS Stone, 1 AS Gold
UNION ALL
SELECT 2 AS BuildingId, 'shed' AS BuildingName, 1 AS Wood, 1 AS Food, 1 AS Stone, 1 AS Gold";
var buildings = new List<Building>();
using(var connection = GetOpenConnection())
{
using(var reader = connection.QueryMultiple(sql))
{
var building = reader.Read<Building, Resource, Building>(
(b, r) => { b.Resource = r; return b; }, splitOn: "Wood");
buildings.AddRange(building);
}
}
foreach(var building in buildings)
{
Console.WriteLine(building);
}
公共类建筑
{
public int BuildingId{get;set;}
公共字符串BuildingName{get;set;}
公共资源资源{get;set;}
公共重写字符串ToString()
{
返回string.Format(“Id:{0}名称:{1}资源:{2}”,BuildingId,BuildingName,Resource);
}
}
公共类资源
{
公共int Wood{get;set;}
公共int食物{get;set;}
公共int Stone{get;set;}
公共整数Gold{get;set;}
公共重写字符串ToString()
{
返回string.Format(“木头:{0}食物:{1}石头{2}黄金{3}”,木头,食物,石头,黄金);
}
}
var sql=@“选择1作为BuildingId,'塔'作为BuildingName,1作为木材,1作为食物,1作为石头,1作为黄金
联合所有
选择2个作为建筑ID,“棚”作为建筑名称,1个作为木材,1个作为食物,1个作为石头,1个作为黄金”;
var建筑物=新列表();
使用(var connection=GetOpenConnection())
{
使用(var reader=connection.QueryMultiple(sql))
{
var building=reader.Read(
(b,r)=>{b.Resource=r;返回b;},splitOn:“Wood”);
建筑物。AddRange(建筑物);
}
}
foreach(建筑物中的var建筑物)
{
控制台。写线(大楼);
}
:)是的,实践项目无需浪费^^无法将类型“BusinessLayer.Resource.Resource”隐式转换为“BusinessLayer.Building.Building”>>在这里“b.Resource=r”我尝试过(Resource.Resource)(b.Resource)=r无法使其工作。但是如果只是尝试测试jump:(检查我的编辑。这是一个函数
,所以我忘了添加返回。C#3.0中引入了自动实现的属性,请参见。自动属性不是必需的,但它们更方便。我倾向于比构造函数更频繁地使用。
var buildings = new List<Building.Building>();
using (IDbConnection connection = OpenConnection())
{
using(var reader = connection.QueryMultiple("UserBuildingGet",
new { UserId = UserId },
commandType: CommandType.StoredProcedure))
{
var building = reader.Read<Building.Building,
Resource.Resource,
Building.Building>
((b, r) => { b.Resource = r; return b; }, splitOn: "Wood");
buildings.AddRange(building);
}
}
return buildings;
public class Building
{
public int BuildingId { get; set; }
public string BuildingName { get; set; }
public Resource Resource { get; set; }
public override string ToString()
{
return string.Format("Id: {0} Name: {1} Resource: {2}", BuildingId, BuildingName, Resource);
}
}
public class Resource
{
public int Wood { get; set; }
public int Food { get; set; }
public int Stone { get; set; }
public int Gold { get; set; }
public override string ToString()
{
return string.Format("Wood: {0} Food: {1} Stone {2} Gold {3}", Wood, Food, Stone, Gold);
}
}
var sql = @"SELECT 1 AS BuildingId, 'tower' AS BuildingName, 1 AS Wood, 1 AS Food, 1 AS Stone, 1 AS Gold
UNION ALL
SELECT 2 AS BuildingId, 'shed' AS BuildingName, 1 AS Wood, 1 AS Food, 1 AS Stone, 1 AS Gold";
var buildings = new List<Building>();
using(var connection = GetOpenConnection())
{
using(var reader = connection.QueryMultiple(sql))
{
var building = reader.Read<Building, Resource, Building>(
(b, r) => { b.Resource = r; return b; }, splitOn: "Wood");
buildings.AddRange(building);
}
}
foreach(var building in buildings)
{
Console.WriteLine(building);
}