2009-10-26 49 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));