Я написал метод, позволяющий передавать Expression для предложения orderby, но столкнулся с этой проблемой.
Невозможно привести тип
«System.DateTime» для ввода
'System.IComparable. LINQ to Entities
поддерживает только приведение Entity Data
Модель примитивных типов.
В основном это выражение:
Expression<Func<K, IComparable>> orderBy
И используется так:
SomeEntities.SomeTable
.Where
(
whereClause
)
.Select
(
selectClause
)
.OrderBy(orderBy)
Идея в том, чтобы я мог использовать словарь для хранения совпадений строк с такими выражениями как:
_possibleSortForForumItem.Add("CreateDate", item => item.CreateDate);
Тогда у меня есть метод, который принимает строку сортировки и возвращает выражение, если оно соответствует ключу в словаре, если нет, возвращает некоторое значение по умолчанию. (Идея заключается в том, чтобы управлять тем, что можно упорядочить). Теперь это работает для свойств String, но пока не для datetime или integer, как я получаю сообщение об ошибке выше.
Теперь, насколько я (свободно) понимаю, проблема в том, что Entity Framework требует, чтобы он был типом Primary / EDM, потому что он должен преобразовывать C # 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();