Я пытаюсь сделать LINQ to SQL, поэтому я создаю дерево выражений.
Моя проблема в том, что Expression<Func<T, bool>> expr
содержит «Convert ()» дважды вместо этого только один раз. В результате получается x => (Convert(Convert(x).Material) == 1)
вместо x => (Convert(x).Material == 1)
. Я создал образец кода для воспроизведения проблемы. У него есть два объекта - House
и Apartment
. Они реализуют IAddItem
. Интерфейс IAddItem
содержит только одно поле, перечисление Material
. Material
состоит из двух членов Bricks
и Woods
. Класс Building
имеет один универсальный метод MaterialBuilding<T>
, который может принимать House
или Apartment
или любой другой объект, реализованный с помощью IAddItem
. И когда выражение создано, результат будет x => (Convert(Convert(x).Material) == 1)
Почему вместо одного происходит два преобразования, почему это происходит? И есть ли способ обойти это?
using System;
using System.Linq.Expressions;
namespace Buildings
{
class Program
{
static void Main(string[] args)
{
HouseObject ho = new HouseObject();
ho.color = "red";
ho.Material = Material.Woods;
Building.MaterialBuilding(ho);
}
}
public class Building
{
public static void MaterialBuilding<T>(T building) where T : IAddItem
{
Expression<Func<T, bool>> expr = null;
expr = x => x.Material == Material.Woods;
Console.WriteLine(expr);
// Console.ReadKey();
}
}
public class HouseObject: IAddItem
{
public string color { get; set; }
public int rooms { get; set; }
public Material Material { get; set; }
}
public class ApartmentObject: IAddItem
{
public string color { get; set; }
public int floors { get; set; }
public int rooms { get; set; }
public Material Material { get; set; }
}
public interface IAddItem
{
Material Material { get; set; }
}
public enum Material
{
Bricks,
Woods
}
}
Странно то, что когда я запускаю свой образец через онлайн-компилятор, результат получается только с одним Convert (): x => (Convert(x.Material, Int32) == 1)