我目前是供应商类的清单,该供应商类是订单清单。
每个订单都有一个userID和一个用于username的空字符串变量。
然后我有一个包含userID和username的用户列表。
我现在这样做的方式是:
foreach(supplier s in SupplierList)
{
foreach (order o in s.childorders)
{
user u = _users.First(p => p.userid == o.userid);
o.username = u.username;
}
}
我觉得这可能有点低效,我想知道是否可以将其压缩成一个linq查询?
逻辑应该是
将supplierslistlist.childorders.username设置为_users中supplierslist.childorders.userid == _users.userid
的值。
我对Linq来说相当新,所以对此有任何建议都会被贬低,或者如果它是一个坏主意,并保持原样/原因为什么也会好。
由于
答案 0 :(得分:2)
你想要做的是迭代一个集合(很多集合,真的,但它没有什么区别)和 mutate 其成员。 LINQ并不是真正针对执行变异操作而是针对查询。您可以使用LINQ来完成它,但它是against the spirit of the tool。
如果您自己构建SupplierList
,则可以使用LINQ适当地获取数据,以便按预期填充它。
否则,我会保留foreach
原样。您可以创建一个字典,将ID映射到用户,以使内部循环更快,但这是您的调用,它取决于您的数据大小。
答案 1 :(得分:1)
如果用户列表包含许多元素,那么它可能非常慢,所以我使用临时字典:
var userById = users.GroupBy(x => x.userid)
.ToDictionary(x => x.Key, x => x.First());
foreach(var order in supplier.SelectMany(x => x.childorders))
{
order.username = userById[order.userid].username;
}
答案 2 :(得分:1)
var orderUserPairs = SupplierList
.SelectMany(s => s.ChildOrders)
.Join(_users, o => o.UserId, u => u.userId, (Order, User) => new {Order, User});
foreach (var orderUserPair in orderUserPairs)
orderUserPair.Order.username = orderUserPair.User.username;
虽然将username
和userId
作为订单的一部分看起来很可疑。
答案 3 :(得分:1)
您需要使用SelectMany或连接,具体取决于您使用linq-to-sql或linq与本地集合的天气。如果您使用本地集合,则更好的方法是使用join,否则使用SelectMany。
像这样......加入:
var selection = (from s in SupplierList
join o in s.childholders on s.userid equals o.userid
select new { username = o.username);
或者,对于linq-to-sql:
var selection = (from s in SupplierList
from o in s.childholders
select { username = o.username);
然后,您可以使用您想要的匿名类型。
答案 4 :(得分:1)
我同意Jon,但你可以说:
var orders = (from s in supplier
from o in s.childorders
select new
{
Order = o,
User = _users.First(p => p.userid == o.userid)
}).ToList();
foreach(var order in orders) {
order.Order.username = order.User.username;
}
当然未经测试:)
答案 5 :(得分:1)
首先是一个问题......
看起来您正在对每个订单进行操作。为什么首先需要在供应商列表中循环,因为您似乎没有在循环中使用它?除非订单不属于任何供应商列表,否则您可以跳过该步骤。
如果不是这样,那么我认为你可以使用连接。如果您不熟悉linq中的连接语法,这是一种(简化)方法:
var x = from S in SupplierList
join C in childorders on C.supplierlistID equals S.ID
where [whatever you need here if anything]
select new { field1, field2};
foreach var y in x
{
}
注意我在供应商列表的childorders中假设了一个外键。如果不是这种情况,则必须相应地进行修改。
希望有所帮助。