ストアド プロシージャを介してクエリされた検索結果を EF エンティティにマッピングするのに少し問題があります。私はデータベースファーストのアプローチを使用しています。
単純なエンティティを簡単に取得できますDbContext.Database.SqlQuery<T>
。これは機能し、ストアド プロシージャが適切な列名を返す限り問題ありません。ただし、私の問題は、検索結果とともに関連するエンティティを読み込む必要があることです。
これは私が取り組んでいるものです:
// Product.cs
public class Product
{
public int ProductId { get; set; }
public int CategoryId { get; set; }
public int BrandId { get; set; }
public virtual Category Category { get; set; }
public virtual Brand Brand { get; set; }
}
// Category.cs
public class Category {
public int CategoryId { get; set; }
...
more properties
}
// Brand.cs
public class Brand {
public int BrandId { get; set; }
...
more properties
}
からデータをプルすると、すべてがうまく機能しDbSet<Product>
、ナビゲーション プロパティは期待どおりに遅延ロードされます。
関連するエンティティが適切に入力されるように、必要なすべてのデータをストアド プロシージャから取得する方法はありますか (つまり、特定の方法で列に名前を付ける必要がありますか)。
List<int>
また、ストアド プロシージャからofProductId
を取得し、Linq クエリを使用して 2 回目のデータベースへのアクセスを行い、エンティティを取得する 2番目のアプローチも試しました。
List<int> results = unitOfWork.SqlQuery<int>(
@"EXECUTE dbo.SomeStoredProcedure @Keyword",
new SqlParameter("Keyword", keyword)
).ToList();
List<Product> products = unitOfWork.ProductRepository.Get(
filter: q => results.Contains(q.ProductId)
).ToList();
このアプローチでは 2 つの問題が発生します。データベースへの 2 回のトリップと、どこかで順序が失われます。私が耐えられる最初の問題は、これはトラフィックの少ないアプリであり、余分なデータベースの旅について心配していません.
ただし、2 つ目はより大きな問題です。結果は、ストアド プロシージャ内の検索値のランキングに基づいて、最初のクエリで正しい順序で取得されます。その順序は、2 番目のクエリで失われ、結果セットがランダムに並べられたように表示され、元に戻す方法 (私が見ることができる) がありません。
何か案は?