【问题标题】:Linq to SQL Grouping Child RelationshipsLinq to SQL 分组子关系
【发布时间】:2008-09-22 16:34:25
【问题描述】:

我正在尝试运行 LINQ to SQL 查询,该查询在搜索引擎样式列表的网格视图中返回结果。

在下面的简化示例中,是否可以在单个查询中使用父级 (NAMESOFCHILDREN) 的任何子级的逗号分隔列表填充集合?

var family = from p in db.Parents
             where p.ParentId == Convert.ToInt32(Request.QueryString["parentId"])
             join pcl in db.ParentChildLookup on p.ParentId equals pcl.ParentId
             join c in db.Children on pcl.ChildId equals c.ChildId
             select new
             {
                 Family = "Name: " + p.ParentName + "<br />" + 
                          "Children: " + NAMESOFCHILDREN? + "<br />"
             };

提前致谢。

【问题讨论】:

    标签: c# .net linq linq-to-sql


    【解决方案1】:

    你的加入会搞砸你的基数!您没有父母名单!

    这是一些未经测试的手写代码。在 Linq 设计器中添加关系可为您提供关系属性。 String.Join 会将列表放在一起。

    我添加了两个可选的方法调用。

    Where ... Any 会将父母过滤到只有那些有孩子的父母。我不确定 string.Join 在空数组上的行为。

    ToList 将把父母拉到内存中,孩子将被进一步的数据库调用访问。如果您遇到运行时 string.Join 不受 SQL 翻译器支持 异常,这可能是必要的。此异常意味着 LINQ 尝试将方法调用转换为 SQL Server 可以理解的内容 - 但失败了。

    int parentID = Convert.ToInt32(Request.QueryString["parentId"]);
    
    List<string> result =
      db.Parents
      .Where(p => p.ParentId == parentID)
      //.Where(p => p.ParentChildLookup.Children.Any())
      //.ToList()
      .Select(p => 
        "Name: " + p.ParentName + "<br />" + 
        "Children: " + String.Join(", ", p.ParentChildLookup.Children.Select(c => c.Name).ToArray() + "<br />"
    )).ToList();
    

    另请注意:通常在数据被正确转义以进行标记之前,您不希望混合数据和标记。

    【讨论】:

    • 谢谢。我决定以不同的方式显示这些数据,但这让我朝着正确的方向前进。
    【解决方案2】:

    你可以尝试如下:

    var family = from p in db.Parents            
         where p.ParentId == Convert.ToInt32(Request.QueryString["parentId"])             
        join pcl in db.ParentChildLookup on p.ParentId equals pcl.ParentId             
         select new             {                 
            Family = "Name: " + p.ParentName + "<br />" + string.Join(",",(from c in db.Children where c.ChildId equals pcl.ChildId  select c.ChildId.ToString()).ToArray());
        };
    

    【讨论】:

      【解决方案3】:

      groupby 发布一个老问题的答案。下面的查询将生成公司名称、订单计数和订单 ID,以逗号分隔,来自 Northwind。

      var query = from c in north.Customers
                          join o in north.Orders on c.CustomerID equals o.CustomerID
                          select new { c, o };
      
              var query2 = from q in query
                           group q.o by q.c into g
                           select new { CompanyName = g.Key.CompanyName, 
                                      orderCount = g.Count(), 
                                      orders = string.Join(",", g.Select(o => o.OrderID)) }
                           into result
                               orderby result.orderCount descending
                           select result;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2012-10-07
        • 2023-04-06
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多