使用Dapper填充项目列表

时间:2016-05-26 05:22:03

标签: c# angularjs dapper

我有一个包含以下类的单页应用程序:

public class Item{
    public int Id {get;set;}
    public string Description {get;set;}
    public List<ItemRate> Rates {get;set;}
}

public class ItemRate{
    public int Id {get;set;}
    public int ItemId {get;set}
    public float straightTime {get;set;}
    public float overTime {get;set;}
}

我有一个使用此方法获取项目的服务:

public List<Item> GetItems(string companyId)
{
    return _itemRepository.GetItems(companyId);
}

_itemRepository.GetItems只是调用一个存储过程,该存储过程返回一个包含IdDescription列的表。

我希望能够将List<ItemRate>与相关的Item一起填充。否则,我必须调用一个方法来获取每个ItemRate的{​​{1}}。当我一次以一个Item的形式显示数据时,这很好。现在,我需要显示一个表(Item),该表在同一行显示ng-repeat。我可能有100多个ItemRates,并且希望避免为每个Items手动构建ItemRate列表。 (每Item我的记录永远不会超过5 ItemRate,因此不会成为问题。

如果我要手动构建JSON字符串,它将如下所示:

Item

这可能吗?什么是最有效的方法?我需要在SQL语句中加入吗?我可以获取所有[{ "Id": "5", "Description": "First One", "Rates": [{ "Id": "15", "ItemId": "5", "straightTime": "10", "overTime": "0" }, { "Id": "27", "ItemId": "5", "straightTime": "7", "overTime": "5" }] }, { "Id": "9", "Description": "Second One", "Rates": [{ "Id": "7", "ItemId": "9", "straightTime": "8", "overTime": "1" }] }] ,然后轻松将它们连接到C#中的正确ItemRates吗?

我知道我可以使用SQL来构建具有适当内容的JSON字符串,但SQL不是这样做的地方,我跳过了使用适当工具的好处。

1 个答案:

答案 0 :(得分:1)

首先我改变了类,所以我可以使用linq包含快速测试的方法。

public class ItemRate : IEquatable<ItemRate>
        {
            public int Id { get; set; }
            public int ItemId { get; set; }
            public float straightTime { get; set; }
            public float overTime { get; set; }

            public bool Equals(ItemRate obj)
            {
                if (obj == null)
                    return false;

                if (obj.Id == this.Id)
                    return true;

                return false;
            }
        }



public class Item : IEquatable<Item>
        {
            public int Id { get; set; }
            public string Description { get; set; }
            public List<ItemRate> Rates { get; set; }

            public bool Equals(Item obj)
            {
                if (obj == null)
                    return false;

                if (obj.Id == this.Id)
                    return true;

                return false;
            }
        }

现在我创建了一个测试功能来同时加载项目和费率。您的存储过程将返回,Id,Desc,RateId,StraightTime,OverTime。即。

SELECT i.Id, i.Desc, r.Id AS RateId, r.StraightTime, r.OverTime 
FROM Items i 
INNER JOIN Rates 
on r.ItemId = i.Id

现在让我们一次性加载整个shebang。

        public List<Item> LoadItems()
        {
            //Lets make some fake data
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("Id", typeof(int)));
            dt.Columns.Add(new DataColumn("Desc", typeof(string)));
            dt.Columns.Add(new DataColumn("RateId", typeof(int)));
            dt.Columns.Add(new DataColumn("StraightTime", typeof(float)));
            dt.Columns.Add(new DataColumn("OverTime", typeof(float)));

            for (int x = 0; x < 100; x++)
            {
                DataRow dr = dt.NewRow();

                dr["Id"] = (x % 5);
                dr["Desc"] = String.Format("Desc{0}", (x % 5));
                dr["RateId"] = (x % 20);
                dr["StraightTime"] = (x * 5.5f);
                dr["OverTime"] = (x * 1.5f);

                dt.Rows.Add(dr);
            }


            //Loading the list
            List<Item> itemList = new List<Item>();

            foreach (DataRow dr in dt.Rows)
            {
                Item i = new Item();
                i.Id = (int)dr["Id"];
                i.Description = dr["Desc"].ToString();
                i.Rates = new List<ItemRate>();

                if (!itemList.Contains(i))
                {
                    itemList.Add(i);
                }

                ItemRate r = new ItemRate();
                r.Id = (int)dr["RateId"];
                r.ItemId = (int)dr["Id"];
                r.overTime = (float)dr["StraightTime"];
                r.straightTime = (float)dr["OverTime"];

                var f = itemList.Where(o => o.Id == r.ItemId).FirstOrDefault();
                if (f != null)
                {
                    if (!f.Rates.Contains(r))
                    {
                        f.Rates.Add(r);
                    }
                }
            }