1

ValidDateフィールドを持つデータベースがあります-これは文字列です(間違えました。日時である必要がありますが、データベースを変更することはできません)。

そして今、私はこれをウェブサイトからのパラメータ(validDateStart)と比較したいと思います:

priceList = priceList.Where(p => Convert.ToDateTime(p.ValidDate) >= Convert.ToDateTime(validDateStart));
var list = initPriceList.ToList();

しかし、エラーが発生します。メソッドToDateTimeが実装されていません。

誰か助けてもらえますか?ありがとう!

4

2 に答える 2

3

これは、Linq to Entitiesではサポートされていません(私の知る限り、Linq to SQLでもサポートされていません)。クエリはデータベースで実行されることを忘れないでください。データベースに相当するものはありませんConvert.ToDateTime

クエリでの文字列の解析は、実際には回避策にすぎません。実際の解決策として、これらの列を文字列datetimeではなくデータベースに作成すると、そもそもこの問題は発生しません。

ハッキーな回避策は、すべての行をマテリアライズしてから(そのために使用できますAsEnumerable())、解析を実行することです。ただし、これはパフォーマンスが低下しますが、行が少ない場合は十分に機能する可能性があります。

var startDate = DateTime.Parse(validDateStart);
var list = priceList.AsEnumerable()
                    .Where(p => DateTime.Parse(p.ValidDate) >= startDate);
                    .ToList();

編集:

サンプルの更新では、文字列の比較を行うだけで、必要なことを実行できるように見えます。これはまだハックですが、すべての行をマテリアライズするよりもはるかに優れたパフォーマンスを発揮します。これが可能なのは、日付形式で最も重要な数値が最初に配置され、次に重要度の低い部分が配置されるためです。つまり、年、月、日です(これが当てはまらず、例の月の前に日が来る場合、このソリューションは機能しません。 )。

入力文字列が同じ形式であると仮定すると、validDateStart次のように実行できます。

var list = priceList.Where(p => p.ValidDate.CompareTo(validDateStart) >=0);
                    .ToList();

との文字列比較は、 LinqtoSqlとLinqtoEntitiesString.CompareToの両方でサポートされているようです。

于 2012-07-02T03:11:05.537 に答える
0

データベース内のすべてのレコードが常に年、月、日で始まる場合(たとえば、日付形式はyyyy-MM-dd HH:mm:ssまたはyyyy / MM / ddまたはyyyyMMdd)、区切り記号があるかどうかは関係ありません。 。重要なのは、値は年、月、日で始まる形式にする必要があるということです。

次のことができます。

1:フィルター値(Webサイト)をデータベースにあるのと同じ形式に変換します。

// DateTime format in database: yyyy-MM-dd HH:mm:ss:ffffff
var from = filtro.CreationDateFrom?.ToString("yyyy-MM-dd");
var to = filtro.CreationDateTo?.AddDays(1).ToString("yyyy-MM-dd");

2:そして次のようにクエリを記述します(CompareToメソッドを使用):

var query = (from x in ctx.TskTaskQueues
             where x.CreationDatetime.CompareTo(from) >= 0 
             && x.CreationDatetime.CompareTo(to) <= 0
             select x);

それは私のために働いた!私はLinqToEntitiesを使用していませんが、LinqEntitiesに類似したLinqConnect(Oracle用)を使用しています。

このdd-MM-yyyyのような形式を使用すると、おそらく機能しません。

于 2017-07-21T23:16:18.923 に答える