1

私は、Distinctを自分のコードで機能させるために何時間も努力してきました。

私はEF4.3、MVC3、Razorを使用しており、製品IDと名前までのリストを取得しようとしています。DBに対してSQLクエリを実行すると、問題ありません。

SQLクエリは

SELECT DISTINCT [ProductId]
      ,[Product_Name]
  FROM [dbo].[PRODUCT]

そのテーブルの他の唯一の列は国コードであるため、標準のdistinct()が機能していません。

IEqualityComparerの作成まで行ってきました

コードは次のとおりです。

public class DistinctProduct : IEqualityComparer<PRODUCT>
    {
        public bool Equals(PRODUCT x, PRODUCT y)
        {
            return x.ProductId.Equals(y.ProductId);
        }

        public int GetHashCode(PRODUCT obj)
        {
            return obj.ProductId.GetHashCode();
        }
    }

これが私がそれを呼んだところです。

IEqualityComparer<PRODUCT> customComparer = new DistinctProduct();
IEnumerable<PRODUCT> y = db.PRODUCTs.Distinct(customComparer);

しかし、それがその最後の行に当たると、私はそれから次のようなエラーが発生します...

LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[MyService.Models.PRODUCT] Distinct[PRODUCT](System.Linq.IQueryable`1[MyService.Models.PRODUCT], System.Collections.Generic.IEqualityComparer`1[MyService.Models.PRODUCT])' method, and this method cannot be translated into a store expression.

誰かが私が間違っていることを教えてもらえますか?

ありがとう、

デビッド

4

2 に答える 2

3

次のような区別ができなかった理由はありますか?

var distinctProdcts = (from p in db.PRODUCTs
                       select new { 
                           ProductId = p.ProductId, 
                           Product_Name = p.ProductName 
                      }).Distinct();

これにより、区別を行う前にクエリから国コードが削除されます。

于 2012-05-17T21:44:30.033 に答える
2

Entity Frameworkは、クエリをSQLクエリに変換しようとしています。明らかに、IEqualityComparererを変換する方法がわかりません。問題は、データベースでDistinctを実行するか(この場合、クライアントはフィルター処理された結果のみを取得する)、すべてのデータをクライアントに持ってきて、クライアントでDistinctを選択しても問題ないと思います。データベース側でフィルタリングを実行し(これによりアプリのパフォーマンスが大幅に向上します)、さまざまな戦略を使用して比較できるようにしたい場合は、クエリの上に明確な基準を構築するコードを考え出すことができます。データをクライアントに提供することに問題がない場合(大量のデータになる可能性があることに注意してください)、次のことを実行できるはずです(.ToList()は、データベースのクエリと結果の実体化をトリガーします)。

IEnumerable<PRODUCT> y = db.PRODUCTs.ToList().Distinct(customComparer);
于 2012-05-17T23:55:37.380 に答える