1

できますか、できれば、どのように、次のようなLINQステートメントを記述できますか。

public IQueryable<Advert> SearchSimilarAdverst(string query)
    {
        Levenshtein compute = new Levenshtein();
        return _db.Adverts.Where(a => a.IsActive  && 
              (compute.FindSimilarity(a.Name, query) <= 2));
    }

ありがとう

編集

ジェフリーが提案した解決策にうんざりしていて、それは機能しましたが、このコード行を試したときにEntityCommandExecutionExceptionが発生しました。理由は誰かわかりますか?

adverts.Where(a => a.WhoAmILookingForTags.Any
             (t => compute.FindSimilarity(t.Name,query) <= 2));

タグと広告は多対多の関係に関連しており、WhoAmILookingForTagsはタグのリストです

4

3 に答える 3

3

EFはSQLに変換できないcompute.FindSimilarity(a.Name, query)ため、パフォーマンスを低下させて次のことを行う必要があります。

public IEnumerable<Advert> SearchSimilarAdverst(string query)
{
    Levenshtein compute = new Levenshtein();
    var adverts = _db.Adverts.Where(a => a.IsActive).ToList();
    return adverts.Where(a => compute.FindSimilarity(a.Name, query) <= 2));
}

メソッドの戻りタイプも、戻りタイプを反映するように変更する必要があることに注意してください

FindSimilarity以下にコメントするように、実行が遅れるため、 を使用してフィルタリングする前に、クエリを強制的に実行する必要があります。query.ToList()多くのオプションの1つです。

于 2013-03-14T18:50:53.070 に答える
2

つまり、EFはLinq述語をT-SQL(またはRDBMSが使用するSQLの方言)に変換できる必要があるためです。.NET BCL関数のサブセットのみがサポートされString.Containsています(カスタムユーザーコードはすぐに使用できます)。

複雑な述語の場合は、独自のSQLを手動で作成することをお勧めします。パフォーマンスも大幅に向上します。EFはSQLの生成に時間がかかる可能性があります。

于 2013-03-14T18:51:22.177 に答える
0

私はこれについて間違っていると思いますが、Linq-to-Entitiesクエリでそれが許可されるとは思いません。これらの種類のLINQクエリでは、Where関数内のすべてをSQLステートメントに変換して、基になるデータベースで実行する必要があります。あなたのメソッドはSQL側のものではないので、これを試みると例外が発生します。

通常のLINQクエリの場合(つまり、すべてがすでにメモリに格納された後)、これを実行しても問題はありません。

また、試してみて、機能するかどうかを確認することもできます...

于 2013-03-14T18:51:02.860 に答える