Дерево выражений Convert () повторяется дважды - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь сделать 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)

...