我编写了一个方法,允许传递表达式作为orderby子句,但我遇到了这个问题。
无法将类型'System.DateTime'转换为类型'System.IComparable'。LINQ to Entities仅支持将Entity Data Model原始类型转换。
基本上,表达式是这样的:
我有一个方法,它接受排序字符串并返回表达式,如果它与字典中的键匹配,则返回表达式,否则返回一些默认值。(这个想法是控制可以按什么排序的方式)现在,这对于字符串属性有效,但到目前为止,对于日期时间或整数,我得到了上面的错误消息。
就我(粗略地)理解的问题而言,Entity Framework 需要它成为主/EDM 类型,因为它必须将 C# DateTime 转换为数据库可以处理的内容。
有没有办法将日期时间转换为原始类型,以便仍然可以工作?
解决方案:
获取排序方法的方法:(接受查询并以“有序形式”返回)
通用查询方法的方法签名为:
无法将类型'System.DateTime'转换为类型'System.IComparable'。LINQ to Entities仅支持将Entity Data Model原始类型转换。
基本上,表达式是这样的:
Expression<Func<K, IComparable>> orderBy
这是它的使用方法:
SomeEntities.SomeTable
.Where
(
whereClause
)
.Select
(
selectClause
)
.OrderBy(orderBy)
这个想法是我可以使用一个字典来保存与表达式匹配的字符串,例如:
_possibleSortForForumItem.Add("CreateDate", item => item.CreateDate);
我有一个方法,它接受排序字符串并返回表达式,如果它与字典中的键匹配,则返回表达式,否则返回一些默认值。(这个想法是控制可以按什么排序的方式)现在,这对于字符串属性有效,但到目前为止,对于日期时间或整数,我得到了上面的错误消息。
就我(粗略地)理解的问题而言,Entity Framework 需要它成为主/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();
return order == SortOrder.Ascending ? entities.OrderBy(expression) : entities.OrderByDescending(expression);
来解决了这个问题。 - SoftwareFactor