“表达式树可能不包含使用可选参数的调用或调用”在带有拆分字符串实体的 LINQ 表达式中?
Posted
技术标签:
【中文标题】“表达式树可能不包含使用可选参数的调用或调用”在带有拆分字符串实体的 LINQ 表达式中?【英文标题】:"An expression tree may not contain a call or invocation that uses optional arguments" in LINQ expression with split string entity? 【发布时间】:2020-10-16 16:48:42 【问题描述】:var list1 = _context.Employees.Where(x=> x.EmployeeId.Equals(empId)
&& **x.deptIds.Split(",")**.ToList().Any(p => (p!=(deptId.ToString()))));
其中,x.deptIds 是存储为以逗号分隔的字符串的部门 ID。 出现错误“表达式树可能不包含使用可选参数的调用或调用”。如何解决?
【问题讨论】:
不要在一开始就在字段中存储多个值。这违反了最基本的设计规则。String.Split
等客户端代码无法转换为 SQL
但这已经被存储了。这次不能改变桌子的设计。任何替代代码/解决方案?
这能回答你的问题吗? How to search a varchar field, using LINQ, to build a list of recommendations
由于您是通过 EmployeeId 查找的,我的第一个猜测是您在Employees 表中只有一个这样的行,所以只需使用_context.Employees.FirstOrDefault(x => x.EmployeeId == empId)
获取整行
@GSerg,它有一个解决方案。但这不是一个好方法,因为其中一种解决方案是在数据库对象中采用 .ToList() 然后执行其他过滤操作。这会导致响应时间过长。
【参考方案1】:
只需指定一个可选参数。 string.Split(",")
变为 string.Split(",", System.StringSplitOptions.None)
【讨论】:
【参考方案2】:正如 cmets 所指出的,在一个字段中存储多个值是一个非常糟糕的设计选择,因此当他们必须在 Linq 中使用 String.Split
时,任何人都不应该这样做。
但要回答您的问题,您可以使用String.Contains
、String.StarsWith
和String.EndsWith
,这些都可以翻译成SQL。例如你可以写:
var list1 = _context.Employees.Where(x=> x.EmployeeId.Equals(empId)
&& (x.deptIds.Contains("," + deptId.ToString() + ",")
|| x.deptIds.StartsWith(deptId.ToString() + ",")
|| x.deptIds.EndsWith("," + deptId.ToString()
));
此解决方案可能会根据您在数据库中逗号周围的空格位置而改变。
【讨论】:
以上是关于“表达式树可能不包含使用可选参数的调用或调用”在带有拆分字符串实体的 LINQ 表达式中?的主要内容,如果未能解决你的问题,请参考以下文章