嵌套列表 linq 中的条件
本文关键字:条件 linq 列表 嵌套 | 更新日期: 2023-09-27 18:33:55
>我有两个类
public class Item
{
public string LineID{ get; set; }
public string ItemNo{ get; set; }
public List<Itemcode> ItemcodeList{ get; set; }
}
public class Itemcode
{
public string LineID{ get; set; }
public string code { get; set; }
public string codeValue { get; set; }
}
和两个数据表 DS。表[1]和ds。表格[2]
我正在将两个数据集中的数据转换为项目类列表,其中还包含项目代码类列表
我正在做的如下
List<Item> items = ds.Tables[1].AsEnumerable().Select(dataRow => new Item
{
LineID= Convert.ToString(dataRow.Field<int>("LineID")),
ItemNo= dataRow.Field<string>("ItemNo"),
ItemcodeList = ds.Tables[2].AsEnumerable().Select(row => new Itemcode
{
code= Convert.ToString(row.Field<string>("code")),
codeValue = Convert.ToString(row.Field<string>("codeValue")),
}).ToList()
}).ToList();
上面的代码给出了所有 ds。表[2]行对每行ds。表[1]
但我只想要那些行 LineID 为 ds 的行。表[1]与ds的行ID匹配。表[2],我必须更改条件
恕
我直言,一个更干净的解决方案(这也提高了大型数据集的性能)是首先创建子项的查找,然后组装父项:
var itemCodes = (
from dataRow in ds.Tables[2].AsEnumerable()
select new Itemcode
{
LineID = dataRow.Field<string>("LineID"),
code = dataRow.Field<string>("code"),
codeValue = dataRow.Field<string>("code")
}).ToLookup(ic => ic.LineID);
var lines = (
from dataRow in ds.Tables[1].AsEnumerable()
let lineID = dataRow.Field<string>("LineID")
select new Item
{
LineID = lineID,
ItemNo = dataRow.Field<string>("ItemNo"),
ItemcodeList = itemCodes[lineID].ToList()
}).ToList();
或者,如果您更喜欢方法链语法:
var itemCodes = ds.Tables[2].AsEnumerable().Select(dataRow => new Itemcode
{
LineID = dataRow.Field<string>("LineID"),
code = dataRow.Field<string>("code"),
codeValue = dataRow.Field<string>("code")
}).ToLookup(ic => ic.LineID);
var lines = ds.Tables[1].AsEnumerable()
.Select(dataRow => new {dataRow, lineID = dataRow.Field<string>("LineID")})
.Select(item => new Item
{
LineID = item.lineID,
ItemNo = item.dataRow.Field<string>("ItemNo"),
ItemcodeList = itemCodes[item.lineID].ToList()
}).ToList();
我认为
在这里使用组加入将是一个很好的解决方案。
var items= (from tbl1 in ds.Tables[1].AsEnumerable()
join tbl2 in ds.Tables[2].AsEnumerable()
on tbl1.Field<int>("LineId") equals tbl2.Field<int>("LineID") into g
select new Item
{
LineID = tbl1.Field<int>("LineID").ToString(),
ItemNo = tbl1.Field<string>("ItemNo"),
ItemcodeList = g.Select(row =>
new Itemcode
{
code = row.Field<string>("code").ToString(),
codeValue = row.Field<string>("codeValue").ToString(),
}).ToList()
}).ToList();
只需添加 where 子句并将其与数据行中的 LineId 进行比较
List<Item> items = ds.Tables[1].AsEnumerable().Select(dataRow => new Item
{
LineID= Convert.ToString(dataRow.Field<int>("LineID")),
ItemNo= dataRow.Field<string>("ItemNo"),
ItemcodeList = ds.Tables[2].AsEnumerable().Where(ic=>ic.Field<int>("LineId")==dataRow.Field<int>("LineID")).Select(row => new Itemcode
{
code= Convert.ToString(row.Field<string>("code")),
codeValue = Convert.ToString(row.Field<string>("codeValue")),
}).ToList()
}).ToList();
附加信息
这里 AsEnumerable 与 AsQueryable 不同。在这里,数据已经从您的数据库中获取,并填充在数据集的数据表中。您必须执行 AsEnumerable 的原因是 DataTable 没有实现 IEnumerable
如果你想要lambda解决方案,以下应该可以工作:
List<Item> items =
ds.Tables[0].AsEnumerable().GroupJoin(
ds.Tables[1].AsEnumerable(),
tab1 => tab1.Field<int>("LineID"),
tab2 => tab2.Field<int>("LineID"),
(tab1, tab2) => new Item
{
LineID = Convert.ToString(tab1.Field<int>("LineID")),
ItemNo = tab1.Field<string>("ItemNo"),
ItemcodeList = tab2.AsEnumerable().SelectMany(codes=>
new List<Itemcode>
{
new Itemcode { code = codes.Field<string>("Code")}
}
).ToList()
}
).ToList();