C#表达式适用于数据库,不适用于内存

时间:2019-08-07 08:47:05

标签: c# .net sql-server .net-core

我有一个带有Entity应用程序的.NET Core 2.2,它从用户那里获取字符串输入,然后将其转换为表达式,最后过滤基于它的一些数据。这是一个基于字符串的类构建表达式(基于this文章):

 public async Task<Expression<Func<T, bool>>> GetLinqExpression<T>(string rule)
 {
     var options = ScriptOptions.Default.AddReferences(typeof(T).Assembly);
     return await CSharpScript.EvaluateAsync<Expression<Func<T, bool>>>(rule, options);
 }

在数据库上使用表达式时,可以按预期工作:

var linqExpression = await _linqService.GetLinqExpression<Item>(linqExpressionString);
var filteredItems = _dbContext.Items.Where(linqExpression).ToList();

但是当我尝试使用Compile()方法在内存中进行操作时却没有。

var linqExpression = await _linqService.GetLinqExpression<Item>(linqExpressionString);
var items = _dbContext.Items.ToList();
var filteredItems = items.Where(linqExpression.Compile()).ToList();

在这种情况下,代码成功运行,但是filteredItems集合为空。为什么会这样呢?如何在内存中运行此表达式?

1 个答案:

答案 0 :(得分:1)

在“内存中”和“数据库中”之间对过滤器表达式的求值方式可能有所不同。尤其是当您过滤字符串值时!

在内存中,字符串比较(value == "some value"value.Contains("some value"))区分大小写。

在数据库中,这取决于为该列/表/数据库设置的排序规则。默认情况下,这可能是不区分大小写的(在SqlServer中,排序规则上的“ CI”后缀表示“不区分大小写”,而“ AS”则表示“区分重音”)

因此,数据库返回的记录可能比内存中的数据存储更多。