2

検索エンジン スタイルのリストのグリッド ビューで結果を返す 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

3 に答える 3

4

あなたの結合はあなたのカーディナリティを台無しにしようとしています! 親のリストがありません!

以下は、テストされていないフリーハンド コードです。Linq デザイナーでリレーションシップを追加すると、リレーションシップ プロパティが提供されます。String.Join はリストをまとめます。

オプションのメソッド呼び出しを 2 つ追加しました。

Where ... Any は、親をフィルタリングして、子を持つ親のみに表示します。空の配列での string.Join の動作がわかりません。

ToListは親をメモリにヤンクし、子はさらにデータベース呼び出しによってアクセスされます。これは、ランタイム文字列を取得する場合に必要になる場合があります。結合は、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();

また、注意: 通常、データがマークアップ用に適切にエスケープされるまで、データとマークアップを混在させたくありません。

于 2008-09-22T16:36:11.067 に答える
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());
    };
于 2008-09-22T16:43:56.867 に答える
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;
于 2015-05-08T15:07:39.283 に答える