2011-10-10 97 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