3

私が持っているものと同じプロパティを持つ他のセットでモデルを取得する方法を理解することを目的として、同様の質問をしていました。

問題は次のとおりです。つまり、実際に別のセットに誘導した「類似のプロパティ」の名前は何でしたか。

元の投稿は次のとおりでした: C# LINQ to Entities query for the Intersection of two different properties

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

  1. Pencil.Id(int) および Pencil.Colors(IEnumerable) プロパティを持つ鉛筆
  2. Pen.Id(int) および Pen.Colors(IEnumerable) プロパティを持つペン
  3. ID と名前を持つ色。

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

Raphaelの優れたソリューションはhttps://stackoverflow.com/a/11722191/1062284です

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));

それで、それは大丈夫で、魔法のように機能しますが、一般的な色の名前を学んでみませんか? 同じ色を保持している他のプロパティを取得しますが、その色は何でしたか?

誰かがこの LINQ クエリを生成できるかどうかを評価します。私はLINQの初心者であり、どんな助けにも感謝します。

4

3 に答える 3

2

Intersect拡張機能で減色した色に拡張機能を使用できますSelectMany

var commonColors = 
    db.Pens.SelectMany(p => p.Colors)
        .Insersect(db.Pencils.SelectMany(hb => hb.Colors));

Intersctおそらくセットではなくシーケンスを返すため(チェックしていません)、このような重複を削除できます

var commonColors = 
    db.Pens.SelectMany(p => p.Colors).Distinct()
        .Insersect(db.Pencils.SelcectMany(hb => hb.Colors).Distinct());

たったひとつのPenことのために

Pen p = db.Pens.Find(id); 
var commonColors = Pen.Colors
    .Insersect(db.Pencils.SelcectMany(p => p.Colors));
于 2012-08-01T13:51:23.590 に答える
1

手に複数のペンを持っている場合は、 (in variable pens)を使用します。

var colors = pens.SelectMany(p=>p.Colors).Distinct(); 
var commonColors = db.Pencils.SelectMany (p => p.Colors.Where(c=>colors.Contains(c))).Distinct()

そうでなければ、ペンが 1 つしかない場合 (変数内pen)

var colors = pen.Colors;
var commonColors = db.Pencils.SelectMany (p => p.Colors.Where(c=>colors.Contains(c))).Distinct()
于 2012-08-01T14:30:09.807 に答える
1

まあ、1 つのクエリですべてを取得することが本当に意味があるかどうかはわかりませんが、これを使用すると、鉛筆の匿名オブジェクトのリストと、各鉛筆の一般的な色のリストを取得する必要があります (未テスト)。

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))
.Select(l => new {
   pencil = l,
   colors = l.Color.Where(c => penColorIds.Contains(c.Id))
});
于 2012-08-01T14:38:04.790 に答える