23

私は次のような式を持っています:

var values = Enumerable.Range(1,2);

return message => message.Properties.Any(
    p => p.Key == name 
    && int.Parse(p.Value) >= values[0] 
    && int.Parse(p.Value) <= values[1]);

これは正常にコンパイルされますが、データベースにヒットすると例外がスローされます'LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression '

解析を行わず、値を aにしないと、文字列に対してand演算子をstring[]使用できません。>=<=

p.Valueさまざまな値を保持する文字列ですが、この場合はint

この種の between ステートメントを実行するためにデータベースにクエリを実行する方法はありますか?

4

5 に答える 5

18

私はこの答えが嫌いですが、実際の答えは、簡単にはできないということです。それは本当の痛みになります。多くの間違った回答や、最初からデータベース フィールドを正しいタイプにするべきだと言う人々の回答を見てきましたが、これは役に立ちません。

あなたの質問は、MSDN のこの質問に似ています。

使用している EF の種類に応じて、いくつかの可能性があります。

1. EDMX ファイルを使用しています。

(最初にコードを作成したり、コードを最初にリバース エンジニアリングしたりしません)。

次のようなものを使用できます(この回答から):

[EdmFunction("PlusDomain", "ParseDouble")]
public static double ParseDouble(string stringvalue)
{
    // This method exists for use in LINQ queries,
    // as a stub that will be converted to a SQL CAST statement.
    return System.Double.Parse(stringvalue);
}

次のように EDMX にマップします。

<Function Name="ParseDouble" ReturnType="Edm.Double">
    <Parameter Name="stringvalue" Type="Edm.String" />
    <DefiningExpression>
        cast(stringvalue as Edm.Double)
    </DefiningExpression>
</Function>

2. EF >= 4.1 で最初にコードを使用している場合。

お前、やっちゃったんだな。マイクロソフトは、そのような機能をSqlFunctions. 期待できる最善の方法は、スカラー SQL 関数をデータベースに追加し、(おそらく) それをコンテキストにマップすることです。マイクロソフトは、このようなことを最初にコードで行うことに何の意味もないと考えました。幸いなことに、彼らはそのようなものも完全にブロックしませんでした. Fluent API は強力です。

次のように関数またはストアド プロシージャを呼び出すことができます (参照)。

var outParam = new SqlParameter("overHours", SqlDbType.Int);
outParam.Direction = ParameterDirection.Output;

またはこのように(参照):

var data = context.Database.ExecuteSqlCommand("dbo.sp_getNumberJobs @overHours OUT", outParam);
int numJobs = (int)outParam.Value;

しかし、それらを実際に LINQ to Entities に統合するには、 EntityFramework.CodeFirstStoreFunctions NuGet パッケージを使用してCodeFirstFunctionsのようなものが必要です。SQL 関数をコンテキストにマップしますが、.NET 4.5 専用に作成された外部ライブラリを使用します (こちらを参照)。

代わりに、この質問のように手動で同じことを試みることができます。

私のニーズに合わせて解決したより迅速な解決策は、変換された型でビューを作成することです。これにより、問題全体が回避されます。

于 2014-06-04T00:43:13.707 に答える