0

私はdbに4つのテーブルを持っています:

- News (NewsID(PK), NewsCategoryID(FK), NewsType (FK), NewsFormatID(FK), Caption, Description)
 - NewsType (NewsTypeID (PK), Caption)
 - NewsCategory(NewsCategoryID (PK), Caption)
 - NewsFormat (NewsFormatID (PK), Caption)

2つのPOCOオブジェクトがあります:

public class News
{
    public int NewsID { get; set; }
    public int NewsTypeID { get; set; }
    public int NewsFormatID { get; set; }
    public string Category{ get; set; }
    public string Caption { get; set; }
    public string Description { get; set; }
}

public class NewsCategory
{
    public string Caption { get; set; }
    public List<News> News{ get; set; }
}

Listを返すクエリを作成したい。クエリでは、ニュースをカテゴリ別にグループ化します。私はこのようにしました:

public static List<NewsCategory> GetNews()
    {
        using (var tc = new NewsDataContext())
        {
            var dc = tc.DataContext;
            var newsQuery= (from news in dc.News
                          join newsCategory in dc.NewsCategories on news.NewsCategoryID equals newsCategory.NewsCategoryID
                          join newsType in dc.NewsTypes on news.NewsTypeID equals newsType.NewsTypeID
                          join newsFormat in dc.NewsFormat on news.NewsFormatID equals newsFormat.NewsFormatID
                          select new News
                                     {
                                         NewsID = news.NewsID,
                                         NewsFormatID = newsFormat.NewsFormatID,
                                         Caption = news.Caption,
                                         Description = news.Description,
                                         Category = newsCategory.Caption
                                     });

            return newsQuery.GroupBy(item => item.Category).Select(item => new NewsCategory
                                                                             {
                                                                                 Caption = item.Key,
                                                                                 News= item.ToList()
                                                                             }).ToList();
        }
    }

..そしてこれは機能しています。ここでの私の質問は、POCOクラスNewsからNewsCategoryプロパティを削除し、クエリで直接(結合後)カテゴリ別にグループ化することはできますか?前もって感謝します。

4

2 に答える 2

1

このコードは、クエリの実行後に行/列データをロードして整形する方法を示しています。「データベースでグループ化」することはできませんが、News.Categoryプロパティを削除することはできます。

var query= (
from news in dc.News
from newsCategory in news.NewsCategories
let newsFormat = news.NewsFormat
select new //anon type
{
  NewsID = news.NewsID,
  NewsFormatID = newsFormat.NewsFormatID,
  Caption = news.Caption,
  Description = news.Description,
  Category = newsCategory.Caption
});

//Load anon rows
var rows = query.ToList();

//shape the anon rows into our POCSO's.
List<NewsCategory> result = rows
  .GroupBy(item => item.Category)
  .Select(g => new NewsCategory()
  {
    Caption = g.Key,
    News = g.Select(row => new News()
    {
      NewsID = row.NewsID,
      NewsFormatID = row.NewsFormatID,
      Caption = row.Caption,
      Description = row.Description
    }
  })
  .ToList();

return result;

「データベースでグループ化」したくない理由があります。group byのデータベースの動作は、キーと集計を返すことです。キー要素とグループ要素が必要です。各グループのグループ要素を取得するために、linqtosqlは各グループのキーを使用してデータベースを再クエリします。これにより、多くのラウンドトリップが発生します(n + 1問題として知られています。ここで、nはグループの数であり、+ 1はキーを取得するためのクエリです)。

このEnumerable.GroupByメソッドはグループキーと要素を返します-これはまさにあなたが望むものです。

于 2012-05-02T13:59:29.087 に答える
1

News POCO に NewsCategory プロパティを追加して、遅延/明示的にロードすることができます。

詳細については、この投稿をご覧ください。

于 2012-05-02T13:34:53.310 に答える