Kau*_*nki 3 c# entity-framework
我有以下函数为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);
}
Run Code Online (Sandbox Code Playgroud)
早些时候我正在使用IEnumerable,它首先加载列表中的所有数据然后执行过滤器工作正常(但不正确或最佳实践)
现在我被困在过滤器部分.如何通过所有类型的属性列修复此错误以获得订单?
我做了很多研究,但找不到任何解决方案.
dynamic或者object不能用作TKeyEF的通用参数Queryable.OrderBy(实际上在任何Queryable方法表达式中) - 它必须是键的实际类型.这反过来意味着您不能使用公共Expression<Func<...>>变量来保存keySelector表达式.
解决方案是.OrderBy[Descending]在switch/ caseblock中使用条件.
要更容易处理升序/降序选项(并避免表达式重复),首先要创建一个简单的自定义扩展方法,如下所示:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后移动switch/ case块后
recordFilterd = data.Count();
Run Code Online (Sandbox Code Playgroud)
行并使用上面的helper方法:
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;
}
Run Code Online (Sandbox Code Playgroud)