如何为实体框架核心编写扩展

时间:2020-06-25 04:41:53

标签: entity-framework-core entity-framework-extensions

我实际需要的是对实体有效的Delete方法。换句话说,我希望能够写

cntx.Orders.Where(item => item.Category == "Custom1").Delete();

,并且应该从表Orders中删除类别列值等于“ Custom1”的所有记录。我不太在乎它是否会立即执行或在调用cntx.SaveChanges()之后执行。而且,是的,查询应该是有效的,类似

DELETE FROM Orders WHERE Category = "Custom1"

我知道至少3个用于Entity Framework Core的扩展库,这些扩展库宣传了这些功能,但是它们都不适用于Android。现在,我在想自己编写Delete扩展方法实际上是多么困难。有人可以帮我举个例子吗?显然,我应该能够在表达式树中添加一些内容,框架将调用该内容,依次生成“从订单中删除”,然后生成“ Where(item => item.Category ==“ Custom1”)“替换为“ WHERE Category =“ Custom1”“

因此,显然所有内容都应从

开始
public static class QueryExtension {
   public static void Delete<T>(IQueryable<T> objThis) {
      // The big mystery is what to call here to ensure that "DELETE FROM [TableName]"
      // is entered to the right place of the expression tree and then
      // we somehow need to execute the complete statement here or delegate it to SaveChanges
   }
}

我有点意识到,表达式树到SQL语句的转换发生在表达式访问者的某个地方。这很可能包装在某种类型的Entity Framework语句编译器中。我不知道所有这些入口点都在哪里写我需要的扩展。

0 个答案:

没有答案