2012-01-05 27 views
0

データベース内の目的のレコードの開始日と終了日を設定するために使用する2つのdatetimeピッカーがあります。データベースの「日付」は、文字列としてyyyymmddの形式で格納されますが、一部の日付に文字がありません(例:2001094、その日の最後の桁が欠落しています)。linq where節で.substringメソッドを安全に使用する方法

私は、関連するタイムスパンのレコードを引っ張る単一LINQクエリを作成したいが、私はちょうどこれを行う場合:彼らので(

var = 
    from rec in datacontext 
    where rec.date.substring(0,8) is in the daterange 
    select rec 

を、私は短い弦レコードの範囲の例外から抜け出します長さは8文字ではありません)。

今私はテーブル全体を引っ張り、2つのラムダを使って(1)8個の整数で始まらないすべてのレコードを削除し、次に(2)すべての現在の.substring-safeレコードを削除します。範囲に一致しません。これは動作しますが、実際には醜いです。

where句に2つの条件がある場合、LINQはそれらを順次評価しますか?私は

from ... where (rec.date starts with 8 integers) AND (rec.date is in range) 

を言うならば、それは、彼らが最初の条件に合致していない見ているときにLINQは、レコードをスキップしますか?

私は(も一種の醜い)考えることができる唯一の他の事は、最初のLINQクエリで.StartsWithの代わり.SubStringを使用して、範囲のレコードのうちを削除するには、最初のクエリの後にラムダを使用することです。これは私が今やっているようにすべての行を引っ張るよりも優れていますが、私が探しているエレガントな単一のクエリではありません。

if datetimepickers are both in the same year... 
var=from ... where rec.date.startswith(yyyy) 'at least I'm not pulling in everything... 
var.remove(lambda to remove short date strings) 
var.remove(lambda to remove out of range dates) 
+0

を評価しませんこれは、 'DateTime.TryParse'を使用するように叫んでされています。 –

答えて

2

この場合、文字列の長さのチェックを追加すると問題が解決されます。この場合、LINQはAND条件の最初の部分を評価し、失敗した場合に評価を停止します。それは& & Bを持っているのであれば、Aが偽であれば、それはB

var=from rec in datacontext where rec.date.length >= 8 && rec.date.substring(0,8) is in the daterange select rec 
+0

それは私の質問の要点です。 LINQは、複数条件のwhere句の最初の条件と一致しないレコードをスキップしますか? – bernie2436

+0

私のexpereienceでは答えはyesですが、linqが機能的であることが保証されているかどうかは疑問ですが、評価することを選択することができます。私は、LINQプロバイダがこの注文を決定するものだと信じています。 – Dessus

+1

評価の順序を強制したい場合、またはその順序を保証する場合は、rec.date.myextensionMethod()を呼び出せるように拡張メソッドを作成することをお勧めします。 – Dessus

関連する問題