Я написал метод, позволяющий передать выражение для предложения orderby, но я столкнулся с этой проблемой.
Невозможно применить тип 'System.DateTime' для ввода типа 'System.IComparable. LINQ to Entities поддерживает только листинг данных сущности Модельные примитивные типы.
В основном выражение следующее:
Expression<Func<K, IComparable>> orderBy
И используется следующим образом:
SomeEntities.SomeTable
.Where
(
whereClause
)
.Select
(
selectClause
)
.OrderBy(orderBy)
Идея заключается в том, что я могу использовать словарь для совпадения строк с выражениями типа:
_possibleSortForForumItem.Add("CreateDate", item => item.CreateDate);
Затем у меня есть метод, который принимает строку сортировки и возвращает выражение, если оно соответствует ключу в словаре, если не возвращает значение по умолчанию. (Идея - способ контролировать то, что ее можно упорядочить). Теперь это работает для свойств String, но пока не для datetime или integer, поскольку я получаю сообщение об ошибке выше.
Насколько я понимаю, проблема заключается в том, что Entity Framework нуждается в том, чтобы быть основным/EDM-типом, потому что он должен преобразовать С# DateTime во что-то, что может обрабатывать база данных.
Есть ли способ конвертировать datetime в примитивный тип, чтобы он все еще работал?
Решение
Метод получения заказа методом: (Возьмите запрос и верните его в "упорядоченной форме" )
private static Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>> GetMethodForSort(String sortBy)
{
if (_methodForSort == null)
{
_methodForSort = new Dictionary<String, Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>>>();
_methodForSort.Add(SortForumViewItemCreatedOn, item => item.OrderBy(innerItem => innerItem.CreatedOn));
...
}
Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>> orderMethod;
if(String.IsNullOrEmpty(sortBy) || !_methodForSort.ContainsKey(sortBy))
{
orderMethod = _methodForSort["ForumName"];
}
else
{
orderMethod = _methodForSort[sortBy];
}
return orderMethod;
}
Подпись метода для общего метода запросов:
IList<K> GetListForGrid<T, K>(this ObjectQuery<T> query, ... Func<IQueryable<K>, IOrderedQueryable<K>> orderBy, ...)
И использование переданного метода:
initialQuery = query
.Where
(
somethingEqualsSomething
)
.Select
(
selectClause
);
var orderedQuery = orderBy(initialQuery);
returnValue = orderedQuery
.Skip(numberToShow * realPage)
.Take(numberToShow)
.ToList();