6

给定下面的 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
      );

所以,编译器输出带有类型转换的表达式一定是有原因的。有任何想法吗?

4

1 回答 1

6
于 2010-01-15T15:25:58.653 回答