以下代码抛出NullReferenceException.如果我使用另一列过滤用户表,则不会抛出异常.DateTime类型列会导致此异常.
using (MyDataContext dc = new MyDataContext())
{
var ids = dc.Users.Where(c => c.BirthDate < DateTime.Now.AddYears(-10)).Select(c => c.UserId);
var list = (from c in dc.Users
where ids.Contains(c.UserId)
select c).ToList();
}
Run Code Online (Sandbox Code Playgroud)
像这样的堆栈跟踪:
[NullReferenceException: Object reference not set to an instance of an object.]
System.Data.Linq.SqlClient.SqlFactory.Member(SqlExpression expr, MemberInfo member) +182
System.Data.Linq.SqlClient.QueryConverter.VisitMemberAccess(MemberExpression ma) +260
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +939
System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) +18
System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +18
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +1011
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1003
System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) +18
System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +18
System.Data.Linq.SqlClient.QueryConverter.VisitChangeType(Expression expression, Type type) +12
System.Data.Linq.SqlClient.QueryConverter.VisitCast(UnaryExpression c) +117
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +619
System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) +18
System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +18
System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b) +35
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +427
System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) +18
System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +18
System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b) +35
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +427
System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) +18
System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +18
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate) +125
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) +3403
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +74
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1003
System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) +18
System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector) +17
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) +1368
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +74
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1003
System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) +18
System.Data.Linq.SqlClient.QueryConverter.VisitContains(Expression sequence, Expression value) +377
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) +9129
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +74
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1003
System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) +18
System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +18
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate) +125
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) +3403
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +74
System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1003
System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) +79
System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) +114
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +132
System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +35
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +7667686
System.Linq.Enumerable.ToList(IEnumerable`1 source) +61
lab_test.Page_Load(Object sender, EventArgs ee) in d:\Projeler\Kardelen\Kod\Kardelen.Web.UI\lab\test.aspx.cs:543
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627
Run Code Online (Sandbox Code Playgroud)
有人得到这个例外吗?
谢谢你的回复.
如果我使用另一列过滤用户表,则不会抛出异常.DateTime类型列会导致此异常.
假设你的意思是这个比较: c.BirthDate < DateTime.Now.AddYears(-10)
最有可能的BirthDate是null.如果在您的方案中仅跳过这些用户就足够了,您可以在进行日期比较之前添加一个检查以查看它是否为空.
作为旁注,您应该DateTime.Now.AddYears(-10)在调用之前定义一次Where以防止重新计算,并且随着时间的推移值变化更糟.
DateTime tenYearsAgo = DateTime.Now.AddYears(-10);
var ids = dc.Users
.Where(c => c.BirthDate != null && c.BirthDate < tenYearsAgo)
.Select(c => c.UserId);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5761 次 |
| 最近记录: |