考虑以下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
);
因此,编译器输出带有类型转换的表达式一定有其原因。你有什么想法吗?