2008-09-22 108 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;