以下のアプローチに従って、LINQ To SQL を使用して複数の結果からデータを取得しました。
CREATE PROCEDURE dbo.GetPostByID
(
@PostID int
)
AS
SELECT *
FROM Posts AS p
WHERE p.PostID = @PostID
SELECT c.*
FROM Categories AS c
JOIN PostCategories AS pc
ON (pc.CategoryID = c.CategoryID)
WHERE pc.PostID = @PostID
DataContext から継承するクラスの呼び出しメソッドは次のようになります。
[Database(Name = "Blog")]
public class BlogContext : DataContext
{
...
[Function(Name = "dbo.GetPostByID")]
[ResultType(typeof(Post))]
[ResultType(typeof(Category))]
public IMultipleResults GetPostByID(int postID)
{
IExecuteResult result =
this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())),
postID);
return (IMultipleResults)(result.ReturnValue);
}
}
このメソッドは、ストアド プロシージャ名にマップされる Function 属性だけでなく、ストアド プロシージャが返す結果セットの型を持つ ReturnType 属性でも修飾されていることに注意してください。さらに、メソッドは IMultipleResults の型指定されていないインターフェイスを返します。
public interface IMultipleResults : IFunctionResult, IDisposable
{
IEnumerable<TElement> GetResult<TElement>();
}
そのため、プログラムはこのインターフェイスを使用して結果を取得できます。
BlogContext ctx = new BlogContext(...);
IMultipleResults results = ctx.GetPostByID(...);
IEnumerable<Post> posts = results.GetResult<Post>();
IEnumerable<Category> categories = results.GetResult<Category>();
上記のストアド プロシージャでは、2 つの選択クエリがありました。 1. 結合なしの選択クエリ 2. 結合ありの選択クエリ
ただし、上記の 2 番目の選択クエリでは、表示されるデータはテーブルの 1 つ、つまり Categories テーブルからのものです。しかし、結合を使用して、両方のテーブル、つまりカテゴリと PostCategories からの結果を含むデータ テーブルを表示したいと考えています。
- LINQ to SQL を使用してこれを達成する方法を教えてください。
- 単純な SQL で上記のアプローチを実装するのに対して、上記のアプローチを使用した場合のパフォーマンスのトレードオフは何ですか?