Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用“Dapper.NET”填充一个类;“班级名单”;_C#_.net_Sql Server_Dapper - Fatal编程技术网

C# 用“Dapper.NET”填充一个类;“班级名单”;

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

我是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
#代码>


}

您的代码需要定义数据的分隔方式。使用
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);
}