entity-framework - 在 EF Code First Orderby 函数期间无法将类型“System.Int32”转换为类型“System.Object”
问题描述
我在 EF Code First 中使用规范模式。当我按操作排序时,VS 抛出一个新异常
规范模式复制自eShopOnWeb
我只是改变了一点,这是我的改变代码:
public class Specification<T> : ISpecification<T>
{
public Expression<Func<T, object>> OrderBy { get; private set; }
public Specification(Expression<Func<T, bool>> criteria)
{
Criteria = criteria;
}
public Specification<T> OrderByFunc(Expression<Func<T, object>> orderByExpression)
{
OrderBy = orderByExpression;
return this;
}
}
这是我的调用代码,非常简单:
static void TestSpec()
{
var spec = new Specification<ExcelData>(x => x.RowIndex == 5)
.OrderByFunc(x => x.ColumnIndex);
using (var dbContext = new TechDbContext())
{
var top10Data = dbContext.ExcelData.Take(10).ToList();
var listExcel = dbContext.ApplySpecification(spec).ToList();
Console.WriteLine();
}
}
如果我评论OrderByFunc,那么对我来说一切都很好。vs 没有错误抛出。
我曾多次尝试在谷歌中搜索错误消息,但没有一个答案是我的情况。
所以我必须在这里问一个问题。
当我在SpecificationEvaluator.cs中调试OrderBy属性时,我发现有一个Convert方法。
所以我知道这个错误是关于转换错误的,但是我该如何解决这个转换类型错误呢?
请帮我!
解决方案
解决方案是创建新的 lambda 表达式并Convert
删除 cast (),然后使用它动态调用Queryable
类OrderBy
/OrderByDescending
方法(使用 DLR 调度或反射)或通过Expression.Call
向其发射。
对于第一部分,将以下辅助方法添加到SpecificationEvaluator
类中:
static LambdaExpression RemoveConvert(LambdaExpression source)
{
var body = source.Body;
while (body.NodeType == ExpressionType.Convert)
body = ((UnaryExpression)body).Operand;
return Expression.Lambda(body, source.Parameters);
}
然后替换代码
query = query.OrderBy(specification.OrderBy);
与
query = Queryable.OrderBy((dynamic)query, (dynamic)RemoveConvert(specification.OrderBy));
或者
var keySelector = RemoveConvert(specification.OrderBy);
query = query.Provider.CreateQuery<T>(Expression.Call(
typeof(Queryable), nameof(Queryable.OrderBy),
new[] { typeof(T), keySelector.ReturnType },
query.Expression, keySelector));
对specification.OrderByDescending
.
推荐阅读
- angular - Angular 将变量传递给 HTTP GET
- ios - 将参数从 CollectionViewController 传递到 CollectionViewCell
- c# - 即使安装了 .net 核心,也找不到它。我应该重新启动我的 Mac 以使用 microsoft stack 吗?
- java - Hadoop 映射器直接写入输出。(Reducer 写入 mapper 的输出)
- javascript - 如何使用插件 jscrollpane 修复thead?
- php - 如何以 XML 版本和编码输出 (PHP)
- asp.net-mvc - 显示上传文件列表
- visual-studio-code - 是否可以在 VSCode 中放置代码折叠图标?
- python - Python 3 使用 urlretrive () 和嵌套循环下载 pdf
- excel - 将 SUMIF 函数插入单元格 VBA。预期的语句结束