7

varタイプmyQryに戻るLinqクエリがあります

var myQry = from .....

これは大きなlinqであり、さらにフィルタリングする必要のあるすべてのレコードを返します。私のif条件の1つに、日付をチェックするためにこのように実行されるフィルターがあります。名前に入力した名前が含まれていて、生年月日と正確に一致しているかどうかを確認する必要があります。

コンパイルして実行したこれを試しましたが、正しく機能しませんでした

myQry.Where(x => x.FirstName.Contains(strName) && DateTime.Compare( x.BirthDt, searchDt)>=0).ToList()

次に、これを試して、「DbArithmeticExpression引数は数値の共通型でなければならない」という例外をスローしました。

myQry.Where(x => x.FirstName.Contains(strName) && (x.BirthDt- searchDt).Days == 0).ToList();

クエリでwhere句を使用するこのような状況では、日付の比較を行うための最良の方法は何でしょうか。LinQクエリのwhere句で許可されていない種類の操作は何ですか?

御時間ありがとうございます...

4

4 に答える 4

4

この場合、SqlMethodsクラスのメソッドを使用してSQLServer固有の関数を使用することをお勧めします。

2番目のクエリは次のように書き直すことができます

myQry.Where(x => x.FirstName.Contains(strName) && 
    SqlMethods.DateDiffDay(x.BirthDt, searchDt) == 0).ToList()

これは次のようなものに変換されます

SELECT ... FROM Table WHERE FirstName 
    LIKE '@p0' AND DATEDIFF(Day, BirthDt, @p1) = @p2

ここで、p0、p1、およびp2はパラメーターです。

于 2012-04-10T18:32:37.060 に答える
3

これを試して:

myQry.Where(x => x.FirstName.Contains(strName) &&
x.BirthDt.Date == searchDt.Date).ToList()

上記が機能するには、BirthDtとの両方searchDtが有効なDateTime値である必要があることに注意してください。これで、DateTime値のDate部分のみを比較して、Time部分を破棄しています。

于 2012-04-10T17:23:19.817 に答える
1

サポートされる操作はORMフレームワーク(Nhibernate、EFなど)によって異なりますが、基本的に、使用しているメソッドにSQLへの直訳がない場合は、サポートされない可能性が高いと考えることができます。

そのため、演算子==はサポートされていますがDateTime.Compareメソッドはサポートされていません。または、演算子-inDateTimeは明確な変換がないため、サポートされていません。

常に最も単純な演算子に固執し、メソッドを避けるようにしてください。それでも失敗する場合は、その特定のメソッドがORMでサポートされているかどうかをGoogleで確認する必要があります。

于 2012-04-10T17:37:47.883 に答える
1

Where句の更新と日時ではなく日付の比較に関してLenielMacaferiに同意します。生年月日については、通常、生年月日は関係ありません。2番目の質問に答えるには

LinQクエリのwhere句で許可されていない種類の操作は何ですか?

Where()IEnumerable<T>またはで機能する拡張メソッドですIQueryable<T>。これは、F12キーを押しWhereてソースコードを確認することで確認できます。

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

サポートされている操作は、述語と呼ばれます。述語は、TSource型の引数を取り、条件が一致するかどうかを示すブール値を返すデリゲートです。これは、上記の2番目のパラメーターのコードで確認できます。 Func<TSource, bool> predicate

述語を好きなように定義できます。boolを返し、TSource型の1つのパラメーターを受け入れる限り。

これは通常、ラムダ式を定義することで実現されます。これは、LenielMacaferiが行ったことです。

于 2012-04-10T17:52:52.417 に答える