1

私は次のモデルを定義しました

  public class TodayOrder
{
    public string ID_ORIG { get; set; }
    public string PART_ID { get; set; }
    public string PART_DEX { get; set; }
    public double TimeSecs { get; set; }
 }

そして今、私は次のLinq式を使用してリストにデータを入力しようとしています。

var todaysOrders = DCC.vw_ORD_GP_volumes_lastSets
 .Where(a => a.ID_ORIG == id_orig.ToUpper() && 
             a.PART_ID == Part.ToUpper())
 .Select(a => 
     new TodayOrder{ 
         ID_ORIG = a.ID_ORIG, 
         PART_ID = a.PART_ID, 
         PART_DEX = a.PART_DEX,  
         TimeSecs = a.ReqTime.GetValueOrDefault().TotalSeconds });

List<TodayOrder> lst = todaysOrders.ToList();

ここで、ReqTimeのタイプはTimeSpan?です。

問題は、実行時にエラーが発生することです。SQLにリテラルがありません:00:00:00 -TimeSpanに問題があるようです。

 Line 72:                     });
 Line 73:   ERROR>              lst = todaysOrders.ToList();
 Line 74:  
 [InvalidOperationException: Value has no literal in SQL: 00:00:00]
  System.Data.Linq.SqlClient.Visitor.FormatValue(Object value) +584911
  System.Data.Linq.SqlClient.Visitor.VisitValue(SqlValue value) +32

実際、プロパティTimeSecsを設定している行をコメントアウトすると、すべてが正常に機能しています。

TodayOrderクラスインスタンスをインスタンス化するための正しいアプローチは何でしょうか?

4

1 に答える 1

1

問題は、Linq-to-Sql treisが式a.ReqTime.GetValueOrDefault().TotalSecondsをsqlに変換することですが、失敗します。

選択の前にクエリを評価ToArray()し、クライアント側で選択を行うことで、これを解決できます。

var todaysOrders = DCC.vw_ORD_GP_volumes_lastSets
 .Where(a => a.ID_ORIG == id_orig.ToUpper() && 
             a.PART_ID == Part.ToUpper())
 .ToArray()
 .Select(a => 
     new TodayOrder{ 
         ID_ORIG = a.ID_ORIG, 
         PART_ID = a.PART_ID, 
         PART_DEX = a.PART_DEX,  
         TimeSecs = a.ReqTime.GetValueOrDefault().TotalSeconds });
于 2012-08-31T08:09:36.660 に答える