2010-06-10 2 views
2

다음 비트의 L2S 코드는이 매우 이상한 스택 추적을 제공합니다. 디버거를 연결하고이 디버거 위에 중단 점을 설정하면 transactions.Count()를 평가할 때 문제가있는 것처럼 보입니다. 누구든지이 문제의 원인을 구체적으로 볼 수 있습니까? 트랜잭션 테이블에는이 where 절에 속하는 행이 없습니다.Linq to SQL : System.Data.Linq.SqlClient.QueryConverter.VisitInvocation (InvocationExpression invoke)의 NullReferenceException

L2S 발췌문 :

var transactions = (from t in DataContext.Transactions 
        where t.TransactionDate.Date == date.Date && company.Id == t.Customer.CompanyId 
        select t); 

if (transactions.Count() > 0) // Exception thrown here (transactions.Count()) 
{ 
    foreach (var transaction in transactions) 
    { 
     transaction.Detach(); 
    } 
} 

반환 거래;

스택 추적은 :

[NullReferenceException: Object reference not set to an instance of an object.] 
    System.Data.Linq.SqlClient.QueryConverter.VisitInvocation(InvocationExpression invoke) +471 
    System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1370 
    System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +30 
    System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b) +27 
    System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +449 
    System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +30 
    System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b) +40 
    System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +449 
    System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp) +30 
    System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate) +136 
    System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) +4173 
    System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +70 
    System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1025 
    System.Data.Linq.SqlClient.QueryConverter.VisitAggregate(Expression sequence, LambdaExpression lambda, SqlNodeType aggType, Type returnType) +84 
    System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) +6371 
    System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +70 
    System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1025 
    System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) +111 
    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.Linq.IQueryProvider.Execute(Expression expression) +23 
    System.Linq.Queryable.Count(IQueryable`1 source) +243 
    MyProject.Repositories.TransactionRepository.GetTransactionsOn(DateTime date, Company company) in D:\Build\MyProject\Source\MyProject\Repositories\TransactionRepository.cs:38 
    MyProject.Web.Widgets.RunningSalesTotalWidget.GetView() in D:\Build\MyProject\Source\MyProject\Web\Widgets\RunningSalesTotalWidget.cs:26 
    MyProject.Web.WidgetController.Render(ViewContext viewContext) in D:\Build\MyProject\Source\MyProject\Web\WidgetController.cs:38 
    MyProject.Web.Helpers.WidgetExtensions.RenderWidget(HtmlHelper helper, Int32 id) in D:\Build\MyProject\Source\MyProject.Web\Helpers\WidgetExtensions.cs:20 
    ASP.views_home_index_aspx.__RenderContent2(HtmlTextWriter __w, Control parameterContainer) in d:\Build\MyProject\Source\MyProject.Web\Views\Home\Index.aspx:9 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Control.Render(HtmlTextWriter writer) +10 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in d:\Build\MyProject\Source\MyProject.Web\Views\Shared\Site.Master:30 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Control.Render(HtmlTextWriter writer) +10 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Page.Render(HtmlTextWriter writer) +29 
    System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +56 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060 

완전히이 하나를 잃었다. 누구든지 여기에 도움을 주실 수 있다면 크게 감사하겠습니다!

답변

0

t.Customer이 null 일 수 있습니까? 당신이 뭔가를 시도하고 그 (CompanyIdint이라고 가정) 예외를 던지는없이 작동하는지 볼 수 있습니다 : 귀하의 하위 테이블의

var transactions = (from t in DataContext.Transactions 
        where t.TransactionDate.Date == date.Date 
         && company.Id == (t.Customer != null ? t.Customer.CompanyId : -1) 
        select t); 
+0

또는 '회사'. 아마도 '회사'가 null 일 것입니다. – Steven

+0

아, 그럴 수 있습니다, 나는 그 장면을 줄 것입니다. 아키텍처 관점에서 LINQ 쿼리가 실행 된 후 *까지 * 예외가 throw되지 않는 이유는 무엇입니까? –

+1

@Brad : 쿼리가 실행되는 동안 예외가 throw됩니다. Count를 호출 할 때까지 실행되지 않습니다 (LINQ를 검색하고 그것에 대한 자세한 정보는 "지연 실행"). –

0

하나는 아마도 범인이다. 방금이 오류가 있었고 null 객체를 도우미 함수에 전달했기 때문입니다. 불행하게도 당신은 그 깊은 곳을 밟을 수 없습니다.