簡體   English   中英

使用EnumerableRowCollection和DateTime時出現InvalidoperationException

[英]Invalidoperationexception when using EnumerableRowCollection and DateTime

我最近發現for循環中的以下行給我一個錯誤。 錯誤來自stepEndTime,最后一行代碼如下所示:

EnumerableRowCollection<DERP_Dataset.tblActualValueFloatRow> RowFirstStep = DERP_DataServiceDataSet.tblActualValueFloat.Where(t => t.PointSliceID == StepPointSliceId && t.ActualValue == stepnumbers[stepIndex] && t.UTCDateTime >= startDate).OrderBy(o => o.UTCDateTime);
EnumerableRowCollection<DERP_Dataset.tblActualValueFloatRow> RowNextStep = DERP_DataServiceDataSet.tblActualValueFloat.Where(t => t.PointSliceID == StepPointSliceId && t.ActualValue > stepnumbers[stepIndex] && t.UTCDateTime >= startDate).OrderBy(o => o.UTCDateTime);

DateTime StepStartTime = (RowFirstStep.First().HasErrors) ? DateTime.MaxValue : RowFirstStep.First().UTCDateTime;
string rowNextStepUTCDateTimeString = RowNextStep.First().UTCDateTime.ToString();
    DateTime StepEndTime = (RowNextStep.First().HasErrors) ? DateTime.MaxValue : RowNextStep.First().UTCDateTime;

錯誤:

A first chance exception of type 'System.InvalidOperationException' occurred in System.Core.dll
Message: {"Sequence contains no elements"}
Source: System.Core
StackTrace: at System.Ling.Enumerable.First[TSource](IEnumerable'1 source) 

嘗試找出這一點:

  • 鏈接在這里找到。
  • 使用RowNextStep.First()。isNull不是布爾值,因此不能在循環中使用嗎?
  • 嘗試放入虛擬字符串變量,但是得到了完全相同的錯誤和異常,因此在嘗試調試時沒有學到任何新知識。
  • 我相信RowNextStep.First()。HasErrors每次都評估為false,包括遇到錯誤時。 不確定100%。

對此問題的任何照會將不勝感激。

編輯

通過建議修改了代碼,並產生了一個非常有用的錯誤。

DateTime StepEndTime = (RowNextStep.FirstOrDefault().HasErrors) ? DateTime.MaxValue : RowNextStep.First().UTCDateTime;

錯誤絕對為空。 現在我得到:

A first chance exception of type 'System.NullReferenceException' 

除了!RowNextStep.First()。還有什么方法可以檢查null嗎? 如果需要,我會使用它,但是如果可能的話,我希望避免進行否定。

試圖從一個空對象中獲取項目,這會給您帶來麻煩。

在空列表上調用object.First()時,它將引發異常。 因此,除非您已經知道有項目或計划處理該異常,否則不要調用.First() 因此,如果使用.First()則需要執行以下兩項操作之一(檢查項目或處理異常.First()

當您調用object.FirstOrDefault() ,您總是會得到一個對象。 該對象將是第一個項目,如果沒有項目,則為類型的默認值(通常為null)。 您在調用.FirstOrDefault()時在代碼中遇到的異常是由於您還試圖訪問返回的對象的屬性( .HasErrors )。 這導致空引用異常(您不能從空對象訪問屬性)。

請注意,您還在條件和賦值中多次調用數據集的擴展方法,這很昂貴。

解決此問題的最有效方法可能是使用.FirstOrDefault()將第一(或null)項目存儲在變量中。 然后,您可以在三元條件和分配塊中使用它。

例如:

var firstRowNextStep = RowNextStep.FirstOrDefault();

DateTime StepEndTime = (firstRowNextStep == null || firstRowNextStep.HasErrors)
    ? DateTime.MaxValue
    : firstRowNextStep.UTCDateTime;

也考慮對RowFirstStep進行此操作(即使它現在不會給您帶來任何問題)。

RowFirstStep.First()實例更改為

(RowFirstStep.FirstOrDefault() == null || RowFirstStep.FirstOrDefault().HasErrors())

要么

(!RowFirstStep.Any()  || RowFirstStep.First().HasErrors())

正如喬治所說, .First()在調用一個空集合時將拋出一個異常。 給定一個空集合時, .FirstOrDefault()將返回null(在這種情況下)。

不要多次調用.First()或FirstOrFefault()。您只需執行一次查詢。

var firstRecord = RowFirstStep.FirstOrDefault();
DateTime StepStartTime = DateTime.MaxValue;

if(firstRecord!=null && !firstRecord.HasErrors())
   StepStartTime =firstRecord.UTCDateTime;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM