gpt4 book ai didi

c# - Lambda 表达式编译(== 和等于 char)

转载 作者:行者123 更新时间:2023-11-30 23:14:36 25 4
gpt4 key购买 nike

使用 == 比较 char 类型变量和 Equals在表达式中在 NHibernate 中产生不同的 SQL 查询并导致错误的(优化的?)行为。

我这样构建过滤器表达式:

private Expression<Func<T, bool>> BuildFilter<T>(char firstLetter) where T : IEntity
{
return PredicateBuilder
.True<T>()
.And(ft => ft.FirstLetter.Equals(firstLetter));
}

并像这样使用它:

Session.Query<T>().Where(filter)

如果我将 char 与 .Equals 进行比较它产生下一个查询:

2017-03-23 12:02:52,499 [10] DEBUG NHibernate.SQL - 

select tag0_.Id as col_0_0_
from [ft].[Tags] tag0_
where @p0=1 and tag0_.FirstLetter=@p1
order by tag0_.Title asc;@p0 = True

[Type: Boolean (0:0:0)], @p1 = 'А' [Type: StringFixedLength (4000:0:0)]

如您所见,NHibernate 将 FirstLetter 设为变量 sql 参数 (@p1),这是正确的。

问题:

之前,我使用了与 == 的比较像这样的运算符:

private Expression<Func<T, bool>> BuildFilter<T>(char firstLetter) where T : IEntity
{
return PredicateBuilder
.True<T>()
.And(ft => ft.FirstLetter == firstLetter);
}

这会产生下一个查询:

2017-03-23 12:17:22,718 [23] DEBUG NHibernate.SQL - 

select tag0_.Id as col_0_0_
from [ft].[Tags] tag0_
where @p0=1
and tag0_.FirstLetter='А'
order by tag0_.Title asc;@p0 = True

[Type: Boolean (0:0:0)]

这个查询看起来也是正确的。

但是,稍等片刻...每次调用方法时使用 ==比较将产生与 tag0_.FirstLetter='А' 相同的查询谓词,它不关心过滤器表达式中使用的真实字符值!

这看起来像 NHibernate 缓存或类似的东西?

最佳答案

这是一个 known bug .您可以在 char 属性上调用 .ToString() 并将字面值作为字符串提供以避开错误,但我不确定。

其根源在于某些.Net编译规则导致char在lambda表达式中被转换为int

目前在 master 分支(即将发布的 v5)中修复,我不知道它是否可以向后移植到 v4。

关于c# - Lambda 表达式编译(== 和等于 char),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42971846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com