2010-06-05 52 views
0

我正在使用LINQ2SQL這歸結爲以下查詢的查詢:異常與LINQ2SQL查詢

 


DateTime? expiration = GetExpirationDate(); 
IQueryable<Persons> persons = GetPersons(); 
IQueryable<Items> subquery = from i in db.Items 
          where i.ExpirationDate >= expiration 
          select i; 

return persons.Where(p => p.Items != null && p.Items.Any(item => subquery.Contains(item))); 
 

當我評價函數的結果,我得到一個NullReferenceException和這裏的堆棧跟蹤。任何想法我做錯了什麼?!

基本上我想選擇所有的人,並按物品到期日期過濾它們。

 
    at System.Data.Linq.SqlClient.SqlFactory.Member(SqlExpression expr, MemberInfo member) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitMemberAccess(MemberExpression ma) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitContains(Expression sequence, Expression value) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitQuantifier(SqlSelect select, LambdaExpression lambda, Boolean isAny) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) 
    at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) 
    at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) 
    at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() 
    at System.Linq.SystemCore_EnumerableDebugView`1.get_Items() 
+0

您可能需要發佈GetPersons的代碼。 – 2010-06-05 18:31:23

回答

0

如果過期爲空,它仍然不是空引用(提示:引用)。

哈迪,問題是你寫的聰明的代碼。而是編寫可調試的代碼。

0

expiration null?也許有問題。