次のラムダ式では、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
);
したがって、コンパイラが式を型変換して出力するのには理由があるはずです。何か案は?