6

ado.net エンティティ フレームワークのエンティティへの linq で問題が発生しています。基本的に私がやっていることはこれです:

var results = (from c in companies
    where c.Name.StartsWith(letter)
    select c);

これは次のように SQL に変換されます。

WHERE (CAST(CHARINDEX(@p, [Extent1].[Name]) AS int)) = 1

これは問題ありませんが、私のテーブルには何百万ものレコードがあるため、実行が非常に遅くなります。生成する必要があるのは次のようなものです。

WHERE Name LIKE @p + '%'

私は高低を検索しており、ストアドプロシージャを使用するかエンティティSQLを使用する以外に解決策を見つけることができません...

linq を介してこれを行う方法はありますか? おそらく何らかの方法で linq をエンティティ linq プロバイダーに拡張するか、何らかの方法でコマンド ツリーまたは生成されたクエリを傍受しますか?

4

6 に答える 6

3

私はSQLの専門家ではありませんが、両方の構文を推測しています:

WHERE (CAST(CHARINDEX(@p, [Extent1].[Name]) AS int)) = 1

WHERE Name LIKE @p + '%'

テーブルスキャンまたは理想的にはインデックススキャンのいずれかになります。要するに、彼らは同じことをします。以下の実行計画を見て、これを確認しました。要するに、データベース スキーマまたは検索の実行方法を再考する必要があります。これは LINQ の問題ではありません。

改善が必要な領域の 1 つ: 検索対象の列にインデックスを付けていることを確認してください。

代替テキスト http://download.binaryocean.com/plan1.gif

代替テキスト http://download.binaryocean.com/plan2.gif

于 2009-02-24T14:59:16.460 に答える
2

うわー、それは本当に奇妙な方法です!LINQ-to-SQL (この場合) が使用することに注意してくださいLIKE @p0 + '%'... 非常に奇妙です。

どの EF プロバイダー (データベース) を使用していますか? SQLサーバー?

あなたが言うように、ストアド プロシージャがその仕事をしますが、それを行う必要はありません...非常に、非常に奇妙です...

于 2009-02-23T07:46:22.920 に答える
1

これは、LinqtoEntitiesの既知の問題です。LIKEとは異なり、この構成はインデックスを使用しないようです。

Substring(SUBSTRINGに変換されます)を使用して、ある程度の成功を収めました。実行プランも同様ですが、この場合、クエリははるかに高速に実行されます。

別の「EF2で修正されると確信しています」...:-(

于 2009-04-30T09:37:20.437 に答える
0

「文字」は文字ですか?これを文字列にするとどうなるでしょうか。

var results = (from c in companies
    where c.Name.StartsWith(letter.ToString())
    select c);
于 2009-02-25T00:08:44.300 に答える
0

Link to Entities で real like を非常に簡単に使用できます

これを機能させるために必要なものは次のとおりです。

追加

    <Function Name="String_Like" ReturnType="Edm.Boolean">
      <Parameter Name="searchingIn" Type="Edm.String" />
      <Parameter Name="lookingFor" Type="Edm.String" />
      <DefiningExpression>
        searchingIn LIKE lookingFor
      </DefiningExpression>
    </Function>

このタグの EDMX に:

edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/スキーマ

<schema namespace="" />属性の名前空間も覚えておいてください

次に、上記の名前空間に拡張クラスを追加します。

public static class Extensions
{
    [EdmFunction("DocTrails3.Net.Database.Models", "String_Like")]
    public static Boolean Like(this String searchingIn, String lookingFor)
    {
        throw new Exception("Not implemented");
    }
}

この拡張メソッドは、EDMX 関数にマップされます。

詳細はこちら: http://jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html

于 2015-07-24T09:04:04.917 に答える