- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我之前有以下设置:
public static bool BlogIsLive(BlogPost b)
{
return b.Status == (int)ItemStatus.Active && b.PublishDate < DateTime.Now ;
}
/// Database query
var blogs = (from b in db.BlogPost
where BlogIsLive(b) // <--- super useful, used in multiple places
select b
).ToList()
但是更新到EF Core 3.0后,抛出如下错误
/// The LINQ expression ... could not be translated. Either rewrite the query in a form
/// that can be translated, or switch to client evaluation explicitly by inserting a
/// call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().
我知道这是 EF Core 3.0 中重大变化的一部分
现在我必须在 BlogsIsLive()
之前的所有地方手动编写查询。
var blogs = from b in db.BlogPost
where b.Status == (int)ItemStatus.Active //<--- Annoying repetition of code
&& b.PublishDate < DateTime.Now //<---
select b
这很烦人。有没有办法我可以编写一个插入其中的方法?
我知道 EF 有 DbFunctions,例如,它可以简化比较 Date
值的过程,所以我看不出为什么我不能自己写一些类似的东西Int
、string
或 bool
。
类似于:
public static DbFunction BlogIsLive(BlogPost b)
{
//Example
return DbFunction(b.Status == (int)ItemStatus.Active && b.PublishDate < DateTime.Now);
}
/// Database query
var blogs = (from b in db.BlogPost
where MyDbFunctions.BlogIsLive(b)
select b
).ToList();
我在上面尝试了一些变体,但没有成功。
谢谢。
最佳答案
原始代码有一个严重的错误,该错误也会在任何非核心版本的 EF 中引发 - 它是本地函数,无法转换为 SQL。 Where
接受表达式 作为参数,而不是函数。反正你不需要那个功能。
LINQ 使用 IQueryable 和表达式。每个运算符接受一个 IQueryable 并返回另一个。就是这样Where
和 Select
已经工作了。这意味着您可以创建自己的函数来添加 Where
你想要的条件:
public static IQueryable<BlogPost> WhereActive(this IQueryable<BlogPost> query)
{
return query.Where(b=>b.Status == (int)ItemStatus.Active && b.PublishDate < DateTime.Now);
}
并将其与任何 IQueryable<BlogPost>
一起使用,例如:
var finalQuery = query.WhereActive();
var posts=finalQuery.ToList();
另一个更麻烦的选择是构造 Expression<Func<>>
调用代码,并将其传递给 Where
- 本质上是动态创建 WHERE 条件。在这种情况下,它是不需要的。
EF Core 1.0 添加了一个非常不幸的功能(更像是一种 what-were-they-thinking!
的功能),即客户端评估。如果无法翻译某些内容,只需将所有内容加载到内存中并尝试过滤内容,而无需借助数据库服务器中的索引、执行计划、匹配算法、RAM 和 CPU。
如果一次仅由 1 个客户端加载 100 行,这可能不会被注意到,这对于任何具有少量数据和并发用户的应用程序来说都是性能 killer 。
在 Web 应用程序中,这意味着需要更多的服务器来处理相同的流量。
这就是 2008 年引入 EF 1.0 时删除客户端计算的原因。
关于c# - 如何使用我自己的方法或为 EF Core 查询编写 DbFunction (EF Core 3.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58428949/
我有以下代码,它会截断时间: // does this already exist? var seekScan = (from s in aDb.Item_Scan_Event
我有一个表格,其中小数(和其他类型)保存为字符串。我想在数据库上下文中编写一个 Linq 查询,它将转换为数据库转换而不是本地转换(出于性能原因)。 这个非工作示例在概念上是我想要实现的。 using
我想从数据库中获取一个列表,其中 MyDate 是今天或明天。 我写了下面的代码。 _Log("Now: " + DateTime.Now.ToString()); var v = db_TS.TS_
我尝试通过遵循 this ticket 中最流行的答案来模拟 DbFunctions.Like 函数并像这样创建它的本地实现: public static class DbFunctions {
我有这个 LINQ 到实体: var result = (from inspArch in inspectionArchives from inspAuth in insp
我试图仅按日期过滤数据(截断时间)。数据库中的字段是DateTime。 作为引用,我尝试了这个解决方案,但不起作用: 'Date' is not supported in LINQ to Entiti
我有 100 行不同日期的数据。我想每隔 30 分钟按相同日期对结果进行分组。 相反: 结果一,2016-02-02 13:00:24 结果一,2016-02-02 13:01:24 结果一,2016
我不确定这是否可行,因为我刚刚深入研究 Entity Framework 6。我们正在从 Linq2Sql 迁移,但我们的引擎中有许多基于用户的查询。我们根据用户需求动态编译一些代码,并且必须保持向后
我有一项任务是在特定时间段内获取一组实体。我正在使用代码优先方法和 MySql 服务器。 代码 IQueryable query = dbContext.Set().AsNoTracking(); E
var vals = (from r in result group r by DbFunctions.TruncateTime(r.Created) into
我正在寻找类似 EF.Functions.FreeText 的内容这是在 SQL Server 中实现的,但使用了 MATCH...AGAINST MySQL的语法。 这是我目前的工作流程: AspN
我目前正在尝试对通过 Entity Framework 运行的查询运行一些单元测试。查询本身在实时版本上运行没有任何问题,但单元测试总是失败。 我已将此范围缩小到我对 DbFunctions.Trun
有什么区别: EntityFunctions.TruncateTime 和 DbFunctions.TruncateTime methods? 最佳答案 没有区别。 EntityFunctions 是
我目前正在尝试对通过 Entity Framework 运行的查询运行一些单元测试。查询本身在实时版本上运行没有任何问题,但单元测试总是失败。 我已将此范围缩小到我对 DbFunctions.Trun
我正在尝试在 LinqPad 中使用以下内容(C# 语句): DbFunctions.TruncateTime(mvOutDt).ToString() 它似乎无法识别 DbFunctions。我添加了
我的 .net 应用程序中有以下正常运行的 LINQ public ActionResult Index() { Dictionary> result;
我有一个带有外键链表的模型,即 [Table("a"] public class A { [Key] [Column("a_id")] public int Id { get;
在哪里results1是一个 IQuerable在您尝试按日期过滤之前效果很好: results1 = results1.Where(l => DbFunctions.DiffDays(FromDat
我有一个使用 C# 编写的应用程序在 ASP.NET MVC 5 框架之上。此外,我使用 EntityFramework 6.2 作为 ORM 来与我的数据进行交互。 我使用 Fluent LINQ
我之前有以下设置: public static bool BlogIsLive(BlogPost b) { return b.Status == (int)ItemStatus.Active
我是一名优秀的程序员,十分优秀!