[英]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)
嘗試找出這一點:
對此問題的任何照會將不勝感激。
通過建議修改了代碼,並產生了一個非常有用的錯誤。
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.