6

次のラムダ式では、Province タイプにパブリック プロパティ「byte CountryId」が含まれ、Country タイプにパブリック プロパティ「byte Id」が含まれます。

Expression<Func<Province, bool>> exp = p => p.CountryId == country.Id;

Expression は後で NHibernate Linq プロバイダーによって使用され、例外をスローしました。式変数 exp を調べたところ、等値演算子の両辺が Int32 に変換されていることがわかりました。

{p => (Convert(p.CountryId) = Convert(value
(AddressToGo.Business.Default.AddressComponents+<>c__DisplayClass0).country.Id))}

2 バイト値の等価演算子で、これらの値を事前に 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 に答える