【发布时间】:2013-07-01 09:47:27
【问题描述】:
有没有办法为 Linq2Entities 的附加功能定义 SQL 转换组件。
例如:
myQuery.Where(entity => entity.Contains('foo', SearchFlags.All))
理想情况下,我正在寻找不需要直接编辑和构建新版本 EntityFramework.dll 的东西。有没有办法允许扩展方法到可以支持 SQL 生成的实体框架。
到目前为止,我有一个模板可以代表我需要为 LINQ to Entities 替换的方法:
public static bool Contains(this object source, string searchTerms, SearchFlags flags)
{
return true;
}
当然这会导致错误:
LINQ to Entities 无法识别“Boolean”方法 CONTAINS(System.Object, System.String, SearchFlags)' 方法和这个方法 无法翻译成商店表达式。
明确地说,我不想这样做:
myQuery.AsEnumerable().Where(entity => entity.Contains('foo', SearchFlags.All))
因为我希望能够在 SQL 空间中执行代码,而不是手动返回所有实体。
我也不能使用IQueryable 的.ToString() 并手动执行它,因为我需要实体框架来填充来自多个.Include 连接的对象。
【问题讨论】:
-
"模型声明函数" (msdn.microsoft.com/en-us/library/ee382839.aspx) 或"模型定义函数" (msdn.microsoft.com/en-us/library/ee382833.aspx) 可能是您的一种方式可以试试。 Code-First 不支持两者,仅支持基于 EDMX 的工作流(DB-First 或 Model-First),而后者需要使用不具备所有 SQL 功能的 Entity SQL。
-
@Slauma 看起来都很有用,但是我坚持使用代码优先,我可能会用它们来争辩说我们应该首先使用 DB,因为无论如何我们都将 DB 与 EF 分开管理
-
您在哪个 SQL Server 版本上运行您的代码?
-
我最多可以使用 SQL Server 2012,因此我可以定义一些 CLR 函数来执行我的代码,但我仍然无法使用键入的 Linq
.Where(...)调用它们
标签: sql-server entity-framework linq-to-entities