2

次のLINQtoEntities式があります。

var allItemsOver64 =
  _inventoryContext.Items.Where(
  i => DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65);

問題は、allItemsOver64を使用すると、この式がサポートされていないと表示されることです。このエラーは、CalculateAgeInYearsメソッドの呼び出しが原因で発生しているように感じます。なぜこれが起こっているのですか、どうすれば修正できますか?

ありがとう、

サチン

編集:

IEnumerablesを使用するようにコードを変更した後でも、同じエラーが発生します。これが私のコードです:

DateTime now = DateTime.UtcNow;
            var allItemsOver64 =
                _inventoryContext.Items.Where(
                    i => DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65).AsEnumerable();
            IEnumerable<Item> items65To69 = allItemsOver64.Where(
                i =>
                DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) >= 65 &&
                DateTimeHelper.CalculateAgeInYears(i.PrimaryInsured.DoB, now) <= 69).AsEnumerable();
4

3 に答える 3

5

EFはメソッドをSQLに変換する方法を知らないため、EFクエリでC#メソッドを呼び出すことはできません。

代わりに、最初に呼び出して、をローカルで実行する.AsEnumerable()ように強制します。Where()

于 2012-04-26T14:35:08.460 に答える
2

LinqはヘルパーメソッドをSQLコマンドに解釈できないためです。このようなロジックをdb側で実装するか、すべての値を選択してからクライアント側でチェックする必要があります。どちらも私にとっては魅力的ではありません。そのため、私は常にDBを単純化して、可能な限り単純なクエリを作成しようとしています。

于 2012-04-26T14:34:37.743 に答える
2

関数名から正しく推測できれば、これがあなたが探しているものかもしれないと思います。

using System.Data.Objects.SqlClient;

var allItemsOver64 = _inventoryContext
                     .Items
                     .Where(i => (SqlFunctions
                                  .DateDiff("dd", i.PrimaryInsured.DoB, now) / 365.0) 
                                  >= 65.0);
于 2012-04-26T14:45:56.743 に答える