我有以下功能,可为jquery数据表网格准备数据。 现在,除了字符串
之外,我还面临以下数据类型错误无法将类型“ System.DateTime”强制转换为类型“ System.Object”。 LINQ to Entities仅支持强制转换EDM基本类型或枚举类型。
代码:
public GeneralResponse<IEnumerable<Holiday>> GetHolidays(string filter,
int initialPage,
int pageSize,
out int totalRecords,
out int recordFilterd,
int sortColumn,
string sortDirection)
{
var response = new GeneralResponse<IEnumerable<Holiday>>();
totalRecords = 0;
recordFilterd = 0;
filter = filter.Trim().ToLower();
try
{
Expression<Func<Holiday, dynamic>> expr;
switch (sortColumn)
{
case 0:
expr = p => p.HolidayDate;
break;
case 1:
expr = p => p.Name;
break;
case 2:
expr = p => p.ExchangeMarket.Name;
break;
default:
expr = p => p.CreatedOn;
break;
}
var data = holidayRepository.Query(true);
//var data = holidayRepository.GetAll(true).AsQueryable(); previous working one
totalRecords = data.Count();
//filter
if (!string.IsNullOrWhiteSpace(filter))
{
data = data.Where(x => x.Name.ToLower().Contains(filter));
//todo : Add date search as well
}
recordFilterd = data.Count();
//sort
data = sortDirection == "asc" ? data.OrderBy(expr) : data.OrderByDescending(expr);
data = data
.Skip(initialPage * pageSize)
.Take(pageSize);
var result = data.ToList();
response.Data = result;
}
catch (Exception e)
{
response.Error = true;
response.Exception = e;
}
return response;
}
// This method is under generic repository
public IQueryable<T> Query()
{
return Query(false);
}
之前,我使用的是IEnumerable,它首先加载列表中的所有数据,然后执行过滤器,该过滤器工作正常(但不正确或不可行)
现在,我被过滤器部分卡住了。如何解决此错误,以按所有类型的属性列排序?
我做了很多研究,但找不到任何解决方案。
答案 0 :(得分:7)
dynamic
或object
不能用作EF Queryable.OrderBy
的TKey
泛型参数(实际上在任何Queryable
方法表达式中)-它必须是密钥的实际类型。反过来,这意味着您不能使用公用的Expression<Func<...>>
变量来保存keySelector
表达式。
解决方案是在.OrderBy[Descending]
/ switch
块内使用条件case
。
要使处理升序/降序选项更容易(并避免表达式重复),请首先创建一个简单的自定义扩展方法,如下所示:
namespace System.Linq
{
public static class QueryableExtensions
{
public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool ascending)
{
return ascending ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector);
}
}
}
然后将switch
/ case
块移到
recordFilterd = data.Count();
行并在其中使用上述帮助方法:
bool ascending = sortDirection == "asc";
switch (sortColumn)
{
case 0:
data = data.OrderBy(p => p.HolidayDate, ascending);
break;
case 1:
data = data.OrderBy(p => p.Name, ascending);
break;
case 2:
data = data.OrderBy(p => p.ExchangeMarket.Name, ascending);
break;
default:
data = data.OrderBy(p => p.CreatedOn, ascending);
break;
}