Với biểu thức lambda bên dưới, loại tỉnh chứa thuộc tính công khai "byte CountryId" và loại Quốc gia có chứa thuộc tính công khai "Id byte".Biên dịch biểu thức Lambda
Expression<Func<Province, bool>> exp = p => p.CountryId == country.Id;
Biểu thức sau này được nhà cung cấp NHibernate Linq sử dụng và đã ném ngoại lệ. Khi tôi kiểm tra exp biến biểu thức, tôi phát hiện ra rằng cả hai mặt của toán tử bình đẳng đã được chuyển thành Int32.
{p => (Convert(p.CountryId) = Convert(value
(AddressToGo.Business.Default.AddressComponents+<>c__DisplayClass0).country.Id))}
Tôi không hiểu tại sao toán tử bình đẳng cho hai giá trị byte cần các giá trị đó được chuyển đổi thành Int32 trước. Tôi đã viết các biểu thức trực tiếp wihout cho phép trình biên dịch làm điều đó cho tôi. Biểu thức sau được chuyển đổi bởi nhà cung cấp NHibernate Linq tốt.
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
);
Vì vậy, phải có lý do khiến trình biên dịch đưa ra biểu thức với chuyển đổi loại. Bất kỳ ý tưởng?
Cần thẻ ngôn ngữ. –