2

データベースには 3 つのテーブルがあり、それぞれが edmx にエンティティを持っています。私の問題を説明するために、3 つのテーブルを想像してください。

Table: Make
Fields:
makeID
make

Table: Model
FIelds:
modelID
makeID    foreign key
model

Table: Car
carID
modelID   foreign key
car

Make、Model、および Car エンティティには、エンティティ モデルのすべてのナビゲーション プロパティがあります。遅延読み込みが無効になっています。Jeep Grand Cherokee であるすべての車をプルして、ページに出力できるようにしたいと考えています。

現在、関数の 1 つにこのようなものがあります (C# 4.0)

IEnumerable<Make> makeList =  (((ObjectSet<Lot>)_modelRepository.GetQuery())
         .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee"))
         .Where(mk => mk.make == "Jeep").ToList());

_makeRepository.GetQuery()を返しますIQueryable... リポジトリ パターンを実装します

このクエリは正常に動作するはずです (この例ではテストしていません) が.Include、関数が返されるように車のテーブルを作成するにはどうすればよいですか? Make への直接ナビゲーション プロパティはありません)

POCO オブジェクトを使用しています。

目標は、これを行うために Make エンティティを返す 1 つの関数を用意することです。

foreach(Make myMake in makeList)
{
    Response.Write(myMake.make);

    foreach(Model myModel in myMake.Models)
    {
         Response.Write(myModel.model);

         foreach(Car mycar in myModel.Cars)
         {
              Response.Write(mycar.car);
         }
    }
}

このようなことは不可能に思えますが、それが私たちが目指していることです:

IEnumerable<Make> makeList =  (((ObjectSet<Lot>)_modelRepository.GetQuery())
         .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee"))
         .Include(c => mk.Models.Cars)
         .Where(mk => mk.make == "Jeep").ToList());

また、このすべての情報を含む新しいエンティティを edmx に作成して、その 1 つのオブジェクトを照会できるようにしましたが、キーをマップする必要があるというエラーが表示され続けます... [マッピング] タブでそれらをマップしました (ビジュアルStudio 2010)...クエリを機能させるために戻ってきました。

4

1 に答える 1

2

100%確信はありませんが、次のようなDTOを作成する必要があると思います。

public MakeModelCarDto
{
    public IEnumerable<Make> Makes {get; set;}
    public IEnumerable<Model> Models {get; set;}
    public IEnumerable<Car> Cars {get; set;}
}

次に、次のようにテーブルを結合する必要があります。

_makeRepository.GetQuery()
        .Join(_modelRepository.GetQuery(), mk => mk.makeid, mo => mo.makeid, (mk, mo) => new { mk, mo })
        .Join(_carRepository.GetQuery(), @t => @t.mo.modelid, c => c.modelid, (@t, c) => new { @t, c })
        .Where(@t => @t.@t.mk.make == "Jeep" && @t.@t.mo.model == "Grand Cherokee")
        .Select(@t => new MakeModelCarDto
        {
            Makes = @t.@t.mk,
            Model = @t.@t.mo,
            Cars = @t.c
        }).SingleOrDefault();
于 2010-08-02T16:58:46.537 に答える