4

Entity FrameworkクエリをAsEnumerableにプルするために使用しようとしています。これは、ビューのドロップダウンに入力するモデル プロパティとして使用されます。DbContextIEnumerable<SelectListItem>

ただし、呼び出したにもかかわらず、各クエリは重複したエントリを返し続けますDistinct()

public IEnumerable<SelectListItem> StateCodeList { get; set; }
public IEnumerable<SelectListItem> DivCodeList { get; set; }    

DivCodeList =
    db.MarketingLookup.AsEnumerable().OrderBy(x => x.Division).Distinct().Select(x => new SelectListItem
                    {
                        Text = x.Division,
                        Value = x.Division
                    }).ToList();

StateCodeList =
    db.MarketingLookup.AsEnumerable().OrderBy(x => x.State).Distinct().Select(x => new SelectListItem
                    {
                        Text = x.State,
                        Value = x.State
                    }).ToList();
4

2 に答える 2

2

が効果を発揮するためには、タイプがカスタムタイプの場合、インターフェースDistinctを実装するタイプのオブジェクトがシーケンスに含まれている必要があります。IEquatable

ここに記載されているように:

Distinct は、既定の等値比較子を使用して値を比較することにより、シーケンスから個別の要素を返します。

上記を回避するための 1 つの回避策は、オブジェクトの 1 つのプロパティではなくオブジェクト全体は必要ないと結論付けることができるため、シーケンスの各要素を に射影し、Divisionを作成してOrderByを呼び出すことDistinctです。

var divisions = db.MarketingLookup.AsEnumerable()
                                  .Select(ml=>ml.Division)
                                  .OrderBy(division=>division) 
                                  .Distinct()
                                  .Select(division => new SelectListItem
                                  {
                                     Text = division,
                                     Value = division
                                  }).ToList();

これに関する詳細なドキュメントについては、こちらをご覧ください

于 2015-02-26T23:32:34.237 に答える
1

別のオプション (および当社/チームが頻繁に使用するオプション) は、静的拡張メソッドを追加することです (拡張ライブラリがあります)。

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    return source.Where(e => seenKeys.Add(keySelector(e)));
}

これは次のように呼び出すことができます。

var divisions = db.MarketingLookup.AsEnumerable().DistinctBy(d => d.PrimaryKey)
    .Select(x => new SelectListItem { Text = x.Division, Value = x.Division }).ToList();

必要なレコードを引き出すためにMarketingLookup、呼び出しで好きなプロパティを使用できます。DistinctBy()

于 2015-02-27T00:07:01.833 に答える