2011-10-10 155 views
2

我的程序中有以下兩行代碼。目標是從Value字段返回最高數字。無法爲空Linq.Table.Max()指定可爲空的<Int64>?

MyDataContext context = new MyDataContext(); 
long? id = (long?)context.MyTable.Max(x => x.Value); 

值字段是表中的bigint字段。該表也不能保證它包含行,事實上,它是我現在正在測試的場景。我試圖在MyTable沒有行時運行這個。

第二行返回無效操作異常。

無法將null值分配給類型爲System.Int64的成員,該成員屬於非空值類型。

我試過幾種不同的方法,但我無法得到這個工作。我明顯不理解C#中可空類型的重要內容。

EDIT(解決方案):

感謝Chris的答案,我能找到我的問題和解決方案的真正原因。事實證明,Value字段不是空值,而是因爲lambda表達式中的x是空行。所以我在lambda中添加了一個檢查來查看x是否爲null,如果不是,那麼我可以安全地檢查Value是否爲null。

MyDataContext context = new MyDataContext(); 
long? id = context.MyTable.Max(x => x == null ? (long?)0 : (long?)x.Value); 
+0

我對這個答案略微感到驚訝,因爲錯誤意味着它有一個值,但它是空的。如果在x爲null時試圖執行x.Value,我會期望一個空引用異常。但是,看起來你現在有一個很好的答案。如果你自己想出一個解決方案,最好的做法是將解決方案做成答案(而不是編輯),並將其標記爲正確的答案。這樣,問題就得到了一個與問題本身分離的被接受的答案。 – Chris

+0

我不會自己回答這個問題,但我沒有必要的聲望來做這件事。 – LamdaComplex

回答

3

你最大的功能是試圖返回一個Int64。 Max正在使用的超載在此處定義爲MSDN。你會看到它需要一個參數Func<TSource, long> selector。這是你的lambda表達式,並且說你會給它一個TSource並且它會返回一個long(即Int64)。你的函數做的是當x.Value爲null時返回一個當然無效的空值作爲Int64。

在這種情況下,你應該能夠使用類似:

x=> x.Value!=null?x.Value:Int64.Minvalue 

這意味着,如果x具有它返回一個值,否則返回,這將永遠只能是最大,如果的最小可能值一切爲空。

我應該放棄這段代碼沒有經過測試,但應該給你正確的想法。我最初假設這是一個可爲空的long,但事實證明有重載支持,所以我現在假設x不是一個可爲空的long,只是看起來有點像一個,如果你眯眯int呃正確的方式。

+0

感謝您的建議。雖然它沒有直接解決我的問題,但卻讓我意識到我的錯誤。我需要確保在檢查x.Value是否爲空之前,我的lambda表達式中的x變量不爲null。我將該解決方案作爲編輯發佈。 – LamdaComplex