【问题标题】:Is it possible to extend Entity Framework to add new database query types?是否可以扩展实体框架以添加新的数据库查询类型?
【发布时间】:2014-11-30 06:57:30
【问题描述】:

我是否可以扩展 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 或其他的实现?如果它可能的,那么人们甚至会从哪里开始寻求添加此功能?

【问题讨论】:

  • 我认为您只需在针对 IQueryable 的扩展方法中实现 SQL 命令。
  • @novaterata 这是有道理的,本质上是我想要做的。这适用于 EF 吗?您知道我可以查看和学习的与 EF 一起使用的 IQueryable 扩展示例吗?

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


【解决方案1】:

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

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

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

some hints 关于能够注册“服务”,但我无法弄清楚如何实际实现派生查询提供程序或在仍然使用的同时将新表达式节点转换为 SQL 的东西其他所有内容的现有提供程序实现..

到目前为止,我认为 EF6 是不可能的(如果是的话,我会说它没有很好的文档记录和无人区)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2015-02-03
    • 2014-10-26
    相关资源
    最近更新 更多