是否可以扩展实体框架以添加新的数据库查询类型
本文关键字:数据库 查询 类型 框架 扩展 实体 是否 添加 | 更新日期: 2023-09-27 18:25:42
我是否可以通过在库中写入扩展来扩展EntityFramework(例如v6),以添加对EF当前不支持的新SQL函数的支持。我们使用的是MSSQL,不需要跨数据库功能。我们正在调用C#中的一个方法,该方法string构建一个SQL语句,然后调用ExecuteSqlCommand()
来执行它。这显然非常丑陋,我想知道是否可以扩展EF来添加一个全新的查询功能,如MERGE
。
我们需要整个LINQ查询来像EF一样生成IQueryable
,并将执行推迟到需要时,就像Context.MyCollection.Where(x => x.Num == 6).Select(x => x.ID)
在实际需要值时才执行一样。例如,当调用.ToList()
时
作为一个附带问题,如果我能够扩展EF以添加此功能,那么是否也可以扩展LINQ查询语言。示例:
from s in Context.Schools
where s.District.DistrictName == "District 5"
merge os in Context.OtherSchools using (os.SchoolID == s.SchoolID) into m
when matched Context.OtherSchools.Update(s)
when not matched Context.OtherSchools.Add(s)
select m.inserted.id
或者类似的。。。我知道其中很多都不存在,但我想知道是否有可能扩展linq以添加关键字?如果不是,是否可以扩展EF以向lambda样式添加新功能,如SQL MERGE
或其他功能?如果是可能的,从哪里开始添加此功能?
这是一个老问题,但似乎还没有人回答。
将语言本身扩展到Linq是不可能的。这是内置在C#编译器中的,我不认为它是可扩展的。也就是说,你不能在那里引入merge
关键字。
至于扩展EF本身的查询提供程序,我不确定,但这正是我自己想要的。这意味着您可以使用方法语法而不是Linq进行查询。
有一些关于能够注册"服务"的提示,但我还没能弄清楚如何真正实现派生查询提供程序,或者实现将新的表达式节点转换为SQL的功能,同时仍然使用现有的提供程序实现其他所有功能。。
到目前为止,我认为EF6是不可能的(如果是的话,我认为它没有很好的记录,也没有人的土地)。