2

基本的に、私はASP.NETのQueryExtenderコントロールを持っており、最初にSQL varchar値をCSharp型のTimeSpanに変換し、Linq OrderBy句を適用する必要がありますが、実行時にエラーが発生します.

これが私のコードです:

  protected void FilterProducts(object sender, CustomExpressionEventArgs e)
    {
      e.Query = (from p in e.Query.Cast<accounts>()
                  select p).OrderBy(p=> TimeSpan.Parse(p.TimeTo));
    }

エラー: LINQ to Entities はメソッド 'System.TimeSpan Parse(System.String)' メソッドを認識しません。このメソッドはストア式に変換できません。

4

2 に答える 2

1

これはTimeSpan.Parse、ストアで利用できないためです。SQLServerを使用している場合、クエリはSQLに変換され、そのストアにはありませんTimeSpan.Parse。1つの方法は、リストに変換してから再度クエリを実行することです。

e.Query = (from p in e.Query.Cast<accounts>()
           select p).ToList().OrderBy(p=> TimeSpan.Parse(p.TimeTo));

ToListしかし、上記の解決策は、膨大なデータセットを返す場合に問題を引き起こす可能性があります。

于 2012-08-30T06:59:09.213 に答える
1

データの形状をすべて知らなくても、p.TimeTo次のように文字列値を使用して並べ替えることができると思います。

from p in e.Query.Cast<accounts>()
select p).OrderBy(p => p.TimeTo.Length).ThenBy(p => p.TimeTo)

このように、値1:00は の前にソートされ11:00ます。

編集

取った:

var s = new[] { "12:10", "8:00", "8:20",  "1:00", "1:02", "10:00", "11:10" };

そして違いを見てください

s.OrderBy (x => x);

s.OrderBy (x => x.Length).ThenBy (x => x);

それは次のとおりです。

1:00
1:02
10:00
11:10
12:10
8:00
8:20

1:00
1:02
8:00
8:20
10:00
11:10
12:10

于 2012-08-30T12:15:13.510 に答える