“表达式树可能不包含使用可选参数的调用或调用”在带有拆分字符串实体的 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.ContainsString.StarsWithString.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 表达式中?的主要内容,如果未能解决你的问题,请参考以下文章

在带引号的字符串中展开宏[重复]

为啥音频单元在带闪电插头的耳机下每帧收集 940 字节

在带注释的 FilteredRelation 上使用 exclude 不起作用?

如何将图例定位在带边框的字段集中? [复制]

如何在带警卫的流明中实现多重身份验证?

Hive 在带引号的字段中使用逗号加载 CSV