Динамический запрос и выражение Linq

Я хотел бы построить динамический запрос, но не смог получить требуемый результат. Пожалуйста, смотрите приведенный ниже код. Я пробовал использовать два разных подхода.

  1. Simple Linq , в приведенном ниже коде результатом будет «resultUsingLing».
  2. Dynamic Linq результатом является «resultUsingDynamicLinq» в приведенном ниже коде.

Я хочу получить одинаковый результат как от «resultUsingLing», так и от «resultUsingDynamicLinq». РезультатUsingDynamicLinq не возвращает значения.

public class Test
{
    public string Name { get; set; }
    public string Address { get; set; }
}
public class Program
{
    public static void Main()
    {
        List<Test> testList = new List<Test>() 
        {
            new Test() { Address = "Address", Name = "Name" },
            new Test() { Address = "Address1", Name = "Name1" }, 
            new Test() { Address = "Address2", Name = "Name2" }, 
            new Test() { Address = "Address3", Name = "Name3" },
            new Test() { Address = "Address4", Name = "Name4" } 
        };
        IQueryable<Test> queryableTestData = testList.AsQueryable<Test>();
        var resultUsingLing= queryableTestData.Where(x => x.Address.Equals("Address1"));

        string property = "Address";
        string value = "Address1";
        var type = typeof(Test);
        var pe1 = Expression.Parameter(type, "p");
        var propertyReference = Expression.Property(pe1, property);
        var constantReference = Expression.Constant(value);
        var resultUsingDynamicLinq= Expression.Lambda<Func<Test, bool>>
            (Expression.Equal(propertyReference, constantReference),
            new[] { pe1 }).Compile();
    }
}

person Binod    schedule 17.05.2014    source источник


Ответы (1)


Это потому, что вы нигде не используете созданное вами выражение.

И кстати, вы не должны его компилировать. Компиляция дает вам Func<Test, bool>, что заставит ваш вызов Where использовать IEnumerable.Where, а не IQueryable.Where.

var expression = Expression.Lambda<Func<Test, bool>>
    (Expression.Equal(propertyReference, constantReference),
    new[] { pe1 });

var resultUsingDynamicLinq = queryableTestData.Where(expression).ToList();
person MarcinJuraszek    schedule 17.05.2014