2008-09-22 75 views
2

我试图运行一个LINQ to SQL查询,它返回搜索引擎样式列表中的网格视图中的结果。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 />" 
      }; 

在此先感谢。

回答

4

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

这里有一些未经测试的免费代码。在Linq设计器中添加关系可以为您提供关系属性。 String.Join将把列表放在一起。

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

Where ...任何将过滤父母只有那些有孩子的父母。我不确定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(); 

另请注意:一般而言,您不希望混合数据和标记,直到数据正确转义为标记。

+0

谢谢。我决定以不同的方式展示这些数据,但这让我朝着正确的方向前进。 – 2008-09-23 16:04:33

0

你可以尝试如下:

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()); 
    }; 
0

发布与groupby一个老问题的答案。在查询下方将产生由Northwind以逗号分隔的公司名称,订单数量和订单ID。

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;