0

サブコレクションを含むコレクションがあり、そのうちの 1 つは、DB に yyyymmdd 形式の文字列として格納されている日付フィールドです (「E」や 20085 などのランダムなものもいくつか含まれています)。この日付は、コレクション内のサブコレクションの 1 つでもあります。この日付フィールドは検索に使用されるため、実際の日付にして LINQ ステートメントで使用する必要があります。

LINQ to SQL は SQL に変換できないステートメントをサポートしていないことを知ったので、適切に変換された日付を返す関数を挿入できず、文字列を次のように変換する標準の変換関数をまだ見つけていません。有効な日付オブジェクト。

レイヤード変換も試しましたが、これは次のように悪臭を放ちました。

search = from c in search 
         where c.Object.Any(p=> new DateTime(Convert.ToInt32(p.theDate, Substring(0,4))))... etc.

ここで何をしても変換エラーが発生しました。

私の基本的な質問は次のとおりです。LINQ to SQL は、このような変換のためにインラインで何かをサポートしていますか? 別のオプションは、データモデルを変更するか、ビューを作成することですが、コードでこれを処理する方法があるかどうかを最初に確認したいと思います。私がやろうとしていることは、次のようなものです。

search = from c in search
         where c.subcollection.Any(p=>p.theDate >= min) && c.subcollection.Any(p=>p.theDate <= max)
         select c;

min と max は日付値で渡されます。

ありがとうございました!

4

2 に答える 2

0

このSqlMethodsクラスには、LINQ to SQL で変換可能ないくつかの静的ヘルパー メソッドがあります。これらのほとんどは、DateTime 比較に関係しています。どのメソッドを探しているのか正確にはわかりませんが、System.Data.Linq.SqlClient.SqlMethodsのドキュメント ページで必要なものを見つけることができるはずです。

または、ユーザー定義関数を作成して、SQL 側で変換と比較の問題を処理することもできます。統合には、対応するオブジェクト モデル メソッドをFunctionAttributeで装飾する以上のことは必要ありません(LINQ-to-SQL がメソッドを処理する方法を示します)。このプロセスに関するドキュメントを次に示します。

于 2012-08-16T02:27:41.623 に答える
0

LINQ を使用して日付を比較したいが、SQL 日付列が文字列値である場合は、次を使用します。.CompareTo("2002-01-01") >= 0

これにより、2002-01-01 に一致する日付またはそれ以降の日付が変換されて返されます。これがサブコレクションでどのように機能するかはわかりませんが、例として:

search = from c in search 
     where c.stringDateColumn.CompareTo("2002-01-01") >= 0 
     select c;

編集:「2002-09-04E」、「2004-04-01 34」、「20050604e」、「2005-06-01444」などの文字列の日付を含むテーブルでいくつかのテストを行い、結果はに基づいて返されますyyyy-mm-dd または yyyymmdd 形式の文字列:

search = from c in search
     where c.subcollection.Any(p=>p.theDate.CompareTo(min) >= 0) && c.subcollection.Any(p=>p.theDate.CompareTo(max) <= 0)
     select c;
于 2012-08-16T02:17:46.717 に答える