给定下面的 lambda 表达式,其中 Province 类型包含一个公共属性“byte CountryId”,而 Country 类型包含一个公共属性“byte Id”。
Expression<Func<Province, bool>> exp = p => p.CountryId == country.Id;
该表达式后来被 NHibernate Linq 提供程序使用并引发了异常。当我检查表达式变量 exp 时,我发现等式运算符的两边都转换为 Int32。
{p => (Convert(p.CountryId) = Convert(value
(AddressToGo.Business.Default.AddressComponents+<>c__DisplayClass0).country.Id))}
我不明白为什么两个字节值的相等运算符需要事先将这些值转换为 Int32 。我直接写了表达式,没有让编译器为我做。以下表达式由 NHibernate Linq 提供程序转换得很好。
ParameterExpression prm = Expression.Parameter(typeof(Province), "p");
Expression<Func<Province, bool>> exp =
Expression.Lambda<Func<Province, bool>>
(
Expression.Equal
(
Expression.MakeMemberAccess(prm, typeof(Province).GetProperty("CountryId")),
Expression.Constant(country.Id, typeof(byte))
),
prm
);
所以,编译器输出带有类型转换的表达式一定是有原因的。有任何想法吗?