Учитывая лямбда-выражение ниже, где тип Провинции содержит открытое свойство "byte CountryId" и тип страны, который содержит публичное свойство "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
);
Итак, должна быть причина, по которой компилятор выводит выражение с преобразованием типов. Есть идеи?