【发布时间】:2019-12-18 05:17:05
【问题描述】:
我以前使用过这样的方法来检索实体,它在 ASP.NET Core 2.2 存储库中运行良好(因为我的大多数表都有 CODE属性):
public T GetByCode(string code)
{
PropertyInfo pi = typeof(T).GetProperty("Code");
return _context.Set<T>().FirstOrDefault(t => pi.GetValue(t).ToString().Trim().ToLower() == code.Trim().ToLower());
}
但是,当我将框架更改为 .NET Core 3.1 时,我得到了如下错误:
InvalidOperationException:LINQ 表达式 'DbSet .Where(c => __pi_0.GetValue(c).ToString().Trim().ToLower() == __ToLower_1)' 无法翻译。要么重写查询的形式,可以 被翻译,或通过插入显式切换到客户端评估 调用 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync()。
【问题讨论】:
-
so 错误告诉您问题出在哪里以及该怎么做。问题是什么?
-
这是问题的一部分,我不知道如何将查询重写为 AsEnumerable() 和其余部分
-
@fenixil:这是个糟糕的建议,因为
where将在内存中进行评估;因此;首先获取整个数据集。所以你的“评论”只对一小部分用例有帮助。 -
@Mertez:如果您的数据集足够小,请在 where 之前使用“ToListAsync”。如果不;可以将字符串转换为 SQL 的 google。有许多;你也有那些,但语法不同。另请注意:SQL 中的字符串比较通常是大小写不变的。
-
我发现了一个类似我的问题,但不是@daniel-hilgarth link 的确切答案
标签: c# asp.net-core linq-to-sql entity-framework-core repository-pattern