是否可以扩展Entity Framework以添加新的数据库查询类型?

时间:2014-10-06 01:45:29

标签: c# linq entity-framework extension-methods

我是否有可能扩展EntityFramework(例如v6)以添加对EF当前不支持的新SQL函数的支持,可能是将扩展写入库中。我们使用的是MSSQL,不需要跨数据库功能。我们在C#中调用一个字符串构建SQL语句的方法,然后调用ExecuteSqlCommand()来执行它。这显然非常难看,我想知道是否可以扩展EF以添加全新的查询功能,例如MERGE

我们需要整个LINQ查询来生成IQueryable,就像EF一样,并推迟执行直到需要就像例如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或其他实现的新功能?如果 可能,那么人们甚至会开始寻找添加此功能的地方?

1 个答案:

答案 0 :(得分:1)

这是一个古老的问题,但似乎没有人回答。

不可能扩展Linq语言本身。那是内置在C#编译器中的,我认为它不是可扩展的。也就是说,您不能在此处引入merge关键字。

对于扩展EF本身的查询提供程序,我不确定,但这就是我在寻找自己的东西。这意味着您可以使用方法语法而不是Linq进行查询。

some hints关于能够注册“服务”的信息,但是我还无法弄清楚如何实际实现派生的查询提供程序,或者在仍然将新的表达式节点转换为SQL的情况下使用现有的提供程序实现进行其他所有操作。

到目前为止,我想说EF6是不可能的(如果是这样,我会说它没有得到很好的记录,并且没有人居住)。