Динамическое преобразование свойства Linq в Sql - PullRequest
2 голосов
/ 13 апреля 2010

Я пытаюсь понять динамические деревья linq и выражения. Очень в основном пытается сделать равные, предоставляя столбец и значение в виде строки. Вот что у меня пока

 private IQueryable<tblTest> filterTest(string column, string value)
    {
        TestDataContext db = new TestDataContext();

        // The IQueryable data to query.
        IQueryable<tblTest> queryableData = db.tblTests.AsQueryable();

        // Compose the expression tree that represents the parameter to the predicate.
        ParameterExpression pe = Expression.Parameter(typeof(tblTest), "item");


        Expression left = Expression.Property(pe, column);
        Expression right = Expression.Constant(value);
        Expression e1 = Expression.Equal(left, right);

        MethodCallExpression whereCallExpression = Expression.Call(
            typeof(Queryable),
            "Where",
            new Type[] { queryableData.ElementType },
            queryableData.Expression,
            Expression.Lambda<Func<tblTest, bool>>(e1, new ParameterExpression[] { pe }));

        // Create an executable query from the expression tree.
        IQueryable<tblTest> results = queryableData.Provider.CreateQuery<tblTest>(whereCallExpression);

        return results;
    }

Это прекрасно работает для столбцов в БД. Но не в свойствах в моем коде, например

public partial class tblTest
{
    public string name_test
    {  get { return name; }  }
}

Ошибка не может быть в том, что она не может быть преобразована в SQL. Я попытался переписать свойство как выражение

Большое спасибо

1 Ответ

2 голосов
/ 13 апреля 2010

Чтобы использовать не табличные свойства, вам нужно сначала материализовать запрос и использовать LINQ для объектов. Я не думаю, что вы можете выполнять запросы как к свойствам SQL, так и к свойствам, отличным от SQL, по той причине, что вы заявляете: свойства, не относящиеся к SQL, не имеют перевода SQL. Я подозреваю, что если вы выполните ToList() перед вызовом filterTest(), вы обнаружите, что ваш код прекрасно работает для обоих типов свойств. К сожалению, это, вероятно, не то, что вам нужно, и, если ваше свойство, отличное от SQL, получено из различных столбцов SQL, вам потребуется способ создания выражения, соответствующего определению свойства.

...