【发布时间】:2015-08-18 23:19:54
【问题描述】:
我写了一个方法来允许为 orderby 子句传递一个表达式,但是我遇到了这个问题。
无法转换类型 'System.DateTime' 键入 'System.IComparable'。 LINQ 到实体 仅支持转换实体数据 模型基元类型。
基本上表达式是这样的:
Expression<Func<K, IComparable>> orderBy
并且是这样使用的:
SomeEntities.SomeTable
.Where
(
whereClause
)
.Select
(
selectClause
)
.OrderBy(orderBy)
这个想法是为了让我可以使用字典来保存与表达式匹配的字符串,例如:
_possibleSortForForumItem.Add("CreateDate", item => item.CreateDate);
然后我有一个方法,它接受排序字符串并返回表达式,如果它匹配字典中的键,如果不返回一些默认值。 (这个想法是一种控制可以订购什么的方法)现在这适用于字符串属性,但到目前为止不适用于日期时间或整数,因为我收到上面的错误消息。
现在据我(大致)了解,问题在于实体框架需要它是 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();
【问题讨论】:
标签: entity-framework primitive-types