2009-10-26 82 views
0

我的LINQ to SQL查詢string.Contains與LINQ to SQL中返回一個空例外

PROJETS = PROJETS.Where(p => (p.VilleArrive != "" && p.VilleArrive != null) && p.VilleArrive.Contains(alerte.VilleArrive)); 

被翻譯這樣

SELECT * // (many columns) 
FROM [dbo].[cov_Projet] AS [t0] 
WHERE ([t0].[VilleArrive] <> @p0)  // city != "" 
AND ([t0].[VilleArrive] IS NOT NULL) // city != null 
AND ([t0].[VilleArrive] LIKE @p1)  // city.contains(alert.city) 
ORDER BY [t0].[DateDebut] 

當我手動運行到SQL Server這是很好的執行。但是它在由linq執行時會返回一個ArgumentNullException異常。 實際上,測試「VilleArrive」(「城市」)的列不會爲空,但總是一個空字符串

我真的不明白它爲什麼附加。 我的問題看起來像這個LINQ to SQL and Null strings, how do I use Contains? 但答案不適用於我。

「喜歡」關鍵字似乎調用Linq.SqlClient.SqlHelpers.GetStringContainsPattern(字符串文字,字符轉義)

謝謝您的幫助,對不起我的英語。

這裏堆棧跟蹤我的項目是一個ASP MVC 1.0項目

System.ArgumentNullException是 由用戶代碼消息=「拉 valeur NE peut PAS理由空。\ r \ nNom 杜paramètre未處理:文本」
源= 「將System.Data.Linq」
PARAMNAME = 「文本」 堆棧跟蹤: àSystem.Data.Linq.SqlClient.SqlHelpers.GetStringContainsPattern(字符串 文本,字符逃逸) àSystem.Data。 Linq.SqlClient.PostBindDotNetCon verter.Visitor.TranslateStringMethod(SqlMethodCall MC) àSystem.Data.Linq.SqlClient.PostBindDotNetConverter.Visitor.VisitMethodCall(SqlMethodCall MC) àSystem.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode 節點) à System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression EXP) àSystem.Data.Linq.SqlClient.SqlVisitor.VisitBinaryOperator(SqlBinary BO) àSystem.Data.Linq.SqlClient.PostBindDotNetConverter.Visitor.VisitBinaryOperator( SqlBinary bo) àSystem.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) àSystem.Data.Lin q.SqlClient.SqlVisitor.VisitExpression(SqlExpression EXP) àSystem.Data.Linq.SqlClient.SqlVisitor.VisitSelectCore(一個SQLSelect 選擇) àSystem.Data.Linq.SqlClient.PostBindDotNetConverter.Visitor.VisitSelect(一個SQLSelect 選擇) àSystem.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode 節點) àSystem.Data.Linq.SqlClient.SqlVisitor.VisitAlias(SqlAlias 一個) àSystem.Data.Linq.SqlClient.SqlVisitor.Visit( SqlNode 節點) àSystem.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource 源) àSystem.Data.Linq.SqlClient.SqlVisitor.VisitSelectCore (一個SQLSelect 選擇) àSystem.Data.Linq.SqlClient.PostBindDotNetConverter.Visitor.VisitSelect(一個SQLSelect 選擇) àSystem.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode 節點) à將System.Data.Linq .SqlClient。SqlVisitor.VisitUnion(SqlUnion SU) àSystem.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode 節點) àSystem.Data.Linq.SqlClient.SqlVisitor.VisitAlias(SqlAlias 一個) àSystem.Data。 Linq.SqlClient.SqlVisitor.Visit(SqlNode 節點) àSystem.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource 源) àSystem.Data.Linq.SqlClient.SqlVisitor.VisitSelectCore(一個SQLSelect 選擇) à System.Data.Linq.SqlClient.PostBindDotNetConverter.Visitor.VisitSelect(SqlSelect select) àSystem.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode 節點) àSystem.Data.Linq.SqlClient.SqlProvider.BuildQuery(ResultShape resultShape,類型與resultType,SqlNode 節點,ReadOnlyCollection 1 parentParameters, SqlNodeAnnotations annotations) à System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) à System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.GetQueryText(Expression query) à System.Data.Linq.DataQuery 1.ToString() àcovCake.Services.ProjetAlerts.RetrieveProjectsByUsers(布爾 UpdateAlerts)丹斯 d:\ AspProject \ covCake \ covCake \服務\ ProjetAlerts.cs:LIGNE àcovCake.Controllers.AlertesController.SendAlertEmail(字符串 p)丹斯 d:\ AspProject \ covCake \ covCake \控制器\ AlertesController.cs: ligne àlambda_method(ExecutionScope,ControllerBase,Object []) àSystem.Web.Mvc.ActionMethodDispatc her.Execute(ControllerBase 控制器,對象[]參數) àSystem.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary的2 parameters) à System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2個 參數) àSystem.Web.Mvc.ControllerActionInvoker。 <> c__DisplayClassa.b__7() àSystem.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 濾波器,ActionExecutingContext preContext,Func`1續)
的InnerException:

回答

1

嘗試取出!= ""比較,以及使確保您傳遞的參數不爲空:

PROJETS = PROJETS.Where(p => (p.VilleArrive != null) && 
          (alerte.VilleArrive != null) && 
           p.VilleArrive.Contains(alerte.VilleArrive));