0

MVC3 を使用してインターネット ショップを構築しようとしています。私は EF を使用しており、エンティティ コンテキストを操作するためのインターフェイスが 1 つあります。

public interface IBaseRepository<T> where T : class, IBase, new()
{
    IQueryable<T> Get();
}

そして、このインターフェースで動作する 1 つの抽象クラス:

 public abstract class BaseRepository<T> : 
       IBaseRepository<T> where T : class, IBase, new()
{
    protected abstract ObjectSet<T> EntitySet { get; }

    public virtual IQueryable<T> Get()
    {
        return from obj in EntitySet select obj;
    }
}

したがって、このソリューションを使用して、データベース (SQL) 内のさまざまなテーブルを操作できます。画像はまだ投稿できません。だから私は私のデータベースを説明しようとします:

[製品] - [CategoryProduct(ProductID,CategoryID)] - [Category(ShortName)]

  1. テーブル製品
  2. フィールド ShortName を持つテーブル カテゴリ
  3. 多対多リンクを作成するフィールド ProductID、CategoryID を持つテーブル CategoryProduct。

(私たちは問題に近づいています....)

テーブル「Category」から「ShortName」を取得するメソッドがあります(「リポジトリ」は、1 つのテーブルの dbcontext のみです - 「Category」)。

public ActionResult GetProductInCategory(string shortName)
{
       IEnumerable<Product> = repository.Get()......
        return View();
}

ここに問題があります:ラムダを使用してこれらの3つのテーブルから製品を取得するクエリを作成する必要がありますが、これを行う方法がわかりません。

データベース全体で 1 つのテーブルにしか直接アクセスできないため、linq を使用できません。

説明が下手で申し訳ありませんが、全体像を把握するためのアーキテクチャについて質問がある場合は、お答えします。

4

1 に答える 1

0

EntitySetあなたがEntityFrameworkを使用していて、エンティティクラスにこの構造があると仮定/推測しています

Category
+ShortName
+EntityCollection<CategoryProduct> CategoryProduct

CategoryProduct
+Product

したがって、linq クエリでこれを行うことができます。

BaseRepository<Category> repository = //get your CATEGORY repository
IEnumerable<Product> = repository.Get().Where(c=> c.ShortName == shortName)
                                       .SelectMany(cp => cp.CategoryProduct)
                                       .Select(p => p.Product).ToList();
于 2012-04-12T09:32:06.090 に答える