我有一个包含以下类的单页应用程序:
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
只是调用一个存储过程,该存储过程返回一个包含Id
和Description
列的表。
我希望能够将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不是这样做的地方,我跳过了使用适当工具的好处。
答案 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);
}
}
}