LINQ2SQLを学び始めたばかりで、最初に試したかったことの1つは単純な親子階層ですが、それを行うための良い方法を見つけることができないようです。私はここSOでいくつかの例を見て、グーグルで検索しましたが、それらを直接適用することができなかったので、私が達成しようとしていることを正確に説明します。
タグ付きの一般的な例を使用してみましょう。
データベーステーブル:Post--Post_Tags-タグ
単純なPostクラスを作成したので、Linq2Sqlクラスを渡さないようにします。
public class Post
{
public int Id {get; set;}
public int Title {get; set;}
public IEnumerable<string> Tags {get; set;}
}
Postsテーブルから最新の5つのレコードを選択し、それらに関連するタグを取得して、各PostのTagsプロパティが入力されているIListを返します。
具体的なLinq2Sqlコードを教えていただけますか?
私は試した:
IList<Post> GetLatest()
{
return (from p in _db.Posts
orderby p.DateCreated descending
select new Post
{
Id = p.Id,
Title = p.Title,
Tags = p.Post_Tags.Select(pt => pt.Tag.Name)
}).Take(5).ToList();
}
これは機能しますが、タグレコードごとにPostレコードを複製するため、ユーザーが使用するすべてのメソッドでプロパティマッピング(Id = p.Id、...)を複製する必要があります。次に、このアプローチを試しましたが、この場合、すべてのタグについてDBへのラウンドトリップがあります。
IQueryable<Post> GetList()
{
return (from p in _db.Posts
select new Post
{
Id = p.Id,
Title = p.Title,
Tags = p.Post_Tags.Select(pt => pt.Tag.Name)
});
}
IList<Post> GetLatest()
{
return (from p in GetList()
orderby p.DateCreated descending
select p).Take(5).ToList();
}
従来のADO.NETで実行している場合は、2つの結果セットを返すストアドプロシージャを作成します。1つは投稿レコード、もう1つは関連するタグレコードです。次に、それらをコードにマップします(手動、DataRelation、ORMなど)。LINQ2SQLでも同じことができますか?
このような単純な階層をどのように処理するかについて、いくつかのコードサンプルを見るのは本当に興味があります。
はい、IList <>オブジェクトとカスタムクラスを返したいのですが、クエリ可能なLinq to Sqlオブジェクトではありません。たとえば、Linq2Sqlを放棄する場合は、データアクセスコードに柔軟性を持たせたいからです。
ありがとう。