gpt4 book ai didi

entity-framework - Entity Framework : LINQ to Entities only supports casting Entity Data Model primitive types

转载 作者:行者123 更新时间:2023-12-03 10:54:27 25 4
gpt4 key购买 nike

我写了一个方法来允许为 orderby 子句传递一个表达式,但我遇到了这个问题。

Unable to cast the type 'System.DateTime' to type 'System.IComparable'. LINQ to Entities only supports casting Entity Data Model primitive types.



基本上表达是这样的:
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();

最佳答案

Entity Framework 使这变得困难,我不确定有没有办法用单个返回值类型(IComparable、对象等)来做你想做的事情。您可能会考虑将您的设计重新编写为 name-to- Func<IQueryable<K>, IOrderedQueryable<K>> 的字典。值(value)观:

_possibleSortForForumItem.Add("CreateDate", 
query => query.OrderBy(item.CreateDate));

然后像这样应用它:
var orderedQuery = query.OrderBy(item => item.DefaultOrderColumn);

Func<IQueryable<K>, IOrderedQueryable<K>> assignOrderBy = null;

if (_possibleSortForForumItem.TryGetValue(orderColumnName, out assignOrderBy))
{
orderedQuery = assignOrderBy(query);
}

关于entity-framework - Entity Framework : LINQ to Entities only supports casting Entity Data Model primitive types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1145847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com