0

Code First アプローチで ADO.NET EF を使用しています。私は使っている :

IList<SoleColor> soleColors = SoleColorService.All().ToList();

SoleColorテーブル内のすべてのレコードのリストを取得するには。残っているのは、この列があるため、それらの結果を区別することです。SoleCode同じSoleCode. 私はこのトピックに関する多くの記事を読みましたが、これは私が存在しなければならないと思う解決策を見つけるための最後の試みです. 明らかに

IList<SoleColor> soleColors = SoleColorService.All().Distinct.ToList();

さまざまな理由で機能しませんが、soleColors必要なすべてのレコード/データを保持しています。これらのレコード/データをフィルター処理して、それぞれに 1 つだけを保持するために、もう 1 つの手順が必要ですSoleCode。プレーンなLINQまたは他の方法で実現できるかどうかはわかりません。私が(初心者として)思うのは、それはかなり標準的な仕事のようであり、さまざまな場所で解決策として見たように、既存のメソッドを実装または書き直す必要はないということです。

だから - これを行う標準的な方法はありますか。そうでない場合、少なくとも私には、これは珍しいことではないように思われるので、そのような場合に対処するための一般的なアプローチがあると思います.

PS

これに関連する私のエンティティのコードは次のとおりです。

public class SoleColor : Entity
    {
        [Required]
        public long SoleID { get; set; }
        public virtual Sole Sole { get; set; }
        //Some code..
        [NotMapped]
        public string SoleCode
        {
            get
            {
                if (Sole == null)
                    return string.Empty;

                return Sole.Code;
            }
        }
        //Some code...
4

1 に答える 1

3

これは、グループ化することで実現できます。

SoleColorService.All()
                .GroupBy(x => x.SoleCode)
                .Select(g => g.First())
                .ToList();

OPの編集後の更新:

はマップされていないためSoleCode、次のコードを使用する必要があります。

SoleColorService.All()
                .GroupBy(x => x.Sole == null ? string.Empty : x.Sole.Code)
                .Select(g => g.First())
                .ToList();

これは基本的SoleCodeに、クエリ内のプロパティのコードを繰り返します。DRYに違反しているため、これはあまりきれいではありません。
DRY に違反しない代替案は次のようになります。

SoleColorService.All()
                .AsEnumerable()
                .GroupBy(x => x.SoleCode)
                .Select(g => g.First())
                .ToList();

ただし、これには、最初にデータベースからすべての行をアプリケーションのメモリにフェッチし、そこでグループ化を実行するという欠点があります。

どのソリューションを選択するかを決定する必要があります。私が示したように、どちらにも欠点があります。

于 2013-03-21T13:04:04.473 に答える