帮助LINQ查询

时间:2011-03-22 16:57:40

标签: c# linq

我目前是供应商类的清单,该供应商类是订单清单。

每个订单都有一个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来说相当新,所以对此有任何建议都会被贬低,或者如果它是一个坏主意,并保持原样/原因为什么也会好。

由于

6 个答案:

答案 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;

虽然将usernameuserId作为订单的一部分看起来很可疑。

答案 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中假设了一个外键。如果不是这种情况,则必须相应地进行修改。

希望有所帮助。