[英]where condition inside nested list linq
我有兩節課
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.Tables [1]和ds.Tables [2]
我將數據從兩個數據集中轉換為Item類的列表,其中還包含Itemcode類的列表
我在做什么如下
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.Table [1]的每一行給出了所有ds.Tables [2]行
但是我只需要ds.Table [1]的LineID與ds.Table [2]的LineID匹配的那些行,我必須在其中更改條件
恕我直言,一種更清潔的解決方案(還可以改善大數據集的性能)是首先創建子項的查找,然后組裝父項:
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子句並將其與datarow中的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有所不同。...這里的數據已經從數據庫中獲取,並已填充到DataSet的DataTable中。...之所以要做AsEnumerable,是因為DataTable不實現IEnumerable <T>並且所有Linq查詢僅適用於IEnumerable <T>類型。
如果您要使用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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.