6

次の名前の 3 つのモデルがあります。

Pencil.Id(int) および Pencil.Colors(IEnumerable) プロパティを持つ鉛筆

Pen.Id(int) および Pen.Colors(IEnumerable) プロパティを持つペン

ID と名前を持つ色。

鉛筆は色と関係があります (多対多) ペンは色と関係があります (多対多)

私が持っているペンと同じ色の鉛筆を表示するクエリを作成したいと思います。

以下の LINQ-to-Entities クエリを使用しています。

int id = id_of_the_pen_that_i_am_holding;
Pen p = db.Pens.Find(id);
var list = from m in db.Pencils where m.Colors.Intersect(p.Colors) != null select m;

色モデルは IEnumerable であるため、複数の色があります。例えば; ペンには 15 色、鉛筆には 25 色があります。私が持っているペンの色が、その鉛筆のカラーパレットにもある場合は、対応する鉛筆を持っていきたいです。

しかし、オブジェクトではなく int や string などの通常の変数を使用すると、例外が発生します。

私に何ができる?ご協力いただきありがとうございます。

編集: 次の可能性のある問題について新しい質問を作成しました: C# LINQ to Entities- オブジェクトとオブジェクトのコレクションの交差に関するプロパティ

4

2 に答える 2

9
int id = id_of_the_pen_that_i_am_holding;
Pen p = db.Pens.Find(id);
var penColorIds = p.Color.Select(m => m.Id).ToList();
var list = db.Pencils.Where(pencil => pencil.Color.Any(color => penColorIds.Contains(color.Id));
于 2012-07-30T13:04:13.617 に答える
0

コードを単純化してこのようにするのはどうですか。特にエレガントではないことはわかっていますが、LINQ があなたが望むことを行う良い方法を持っているかどうかはわかりません。

IList<Pencil> sameColorPencils = new List<Pencil>();

Pen p = db.Pens.Find(id);

foreach (Color color in p.Color)
{
    var pencils = from pencil in db.Pencils
                  where pencil.Color == color
                  select pencil;

    foreach (Pencil pencil in pencils)
    {
        if (sameColorPencils.Count(e => e.Id == pencil.Id) == 0)
        {
            sameColorPencils.Add(pencils);
        }
    }
}
于 2012-07-30T13:11:39.290 に答える