Динамическое LINQ to Entity Count () - PullRequest
0 голосов
/ 28 апреля 2009

Я пытаюсь написать следующую короткую строку кода более общим способом.

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

    public int GetChanges(DateTime LastActivityDate)
    {
        KHS.Innopas.Web.Library.DataModels.Documentation.DocumentationEntities ctx = 
            new KHS.Innopas.Web.Library.DataModels.Documentation.DocumentationEntities();

        return ctx.Images.Count(row => row.CreatedAt > LastActivityDate);
    }

Я хочу изменить приведенный выше пример на более общую функцию, например

    public int GetChanges(MetaTable table, string columnName, DateTime LastActivityDate)
    {
        return table.Count(row => row.columnName > LastActivityDate);
    }

То, что я пробовал до сих пор, это

    public int GetChanges(MetaTable table, string columnName, DateTime lastActivityDate)
    {
                    // query = {Table(LanguageText)}
        var query = table.GetQuery();

        MetaColumn dateColumn;
        table.TryGetColumn(columnName,out dateColumn);

        if (dateColumn == null)
            return new string[] {};

        var entityParam = Expression.Parameter(table.EntityType, "row");

        var property = Expression.Property(entityParam, dateColumn.Name);

        var columnLambda = Expression.Lambda(property, entityParam);

        var constant = Expression.Constant(lastActivityDate);

        var GreaterThanCall = Expression.GreaterThan(columnLambda.Body, constant);

        var whereLambda = Expression.Lambda(GreaterThanCall, entityParam);


        var whereCall = Expression.Call(
           typeof(Queryable),
           "Count",
           new Type[] { query.ElementType },
           query.Expression,
           whereLambda);

        var result = query.Provider.CreateQuery(whereCall);

        return result ;
    }

Теперь проблема в том, что whereCall является неправильным и выдает (немецкий) ошибку. Есть идеи, как это должно выглядеть?

Спасибо за вашу помощь. Себастьян

Дополнительная информация: это немецкая ошибка:

* 1018. Имя_параметра: выражение

1 Ответ

1 голос
/ 22 мая 2009

Вы можете выполнить это, используя динамическую библиотеку запросов linq. Это позволяет вам передавать предложения в виде строк. Пример: alt text
(источник: scottgu.com )

Дополнительную информацию можно найти в Блог Скотта Гу

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