是否有任何方法为Linq2Entities的其他函数定义SQL转换组件。
例如:
myQuery.Where(entity => entity.Contains('foo', SearchFlags.All))
理想情况下,我正在寻找不需要直接编辑和构建新版本的EntityFramework.dll的东西。是否有任何方法允许将扩展方法扩展到可以支持SQL生成的实体框架。
到目前为止,我有一个模板来表示我需要替换的LINQ实体的方法:
public static bool Contains(this object source, string searchTerms, SearchFlags flags)
{
return true;
}
当然,这会导致错误:
LINQ到实体不识别方法‘布尔包含(System.Object,System.String,SearchFlags)’方法,并且这个方法不能被转换成存储表达式。
说清楚,我不想做:
myQuery.AsEnumerable().Where(entity => entity.Contains('foo', SearchFlags.All))
因为我希望能够在SQL空间中执行代码,而不是手动返回所有实体。
我也不能使用.ToString()
的IQueryable
并手动执行它,因为我需要实体框架来填充来自几个.Include
联接的对象。
发布于 2013-07-31 22:50:34
最后,我做了以下工作(这很有效,但还远远不够完美):
IEntity
的long Id { get; set; }
context.myEntities.Where(entity => entity.Id != 0)
--这是多余的,因为标识从1开始,但是Linq2Entities不知道这一点。IQueryable
上调用DBQuery<Entity>
,因为它的类型是DBQuery<Entity>
--它返回SQL文本,因此我使用查询限制执行简单的替换操作。.Include(...)
都能工作,我实际上执行了两个不同的sql命令。没有其他更好的方法来利用这一点,因为查询执行计划缓存会导致其他问题(即使在禁用时)。因此,我的代码如下所示:
public IQueryable<IEntity> MyNewFunction(IQueryable<IEntity> myQueryable, string queryRestriction)
{
string rawSQL = myQueryable.Select(entity => entity.Id).ToString().Replace("[Extent1].Id <> 0", queryRestriction);
List<long> ids = // now execute rawSQL, get the list of ids;
return myQuerable.Where(entity => ids.Contains(entity.Id));
}
简而言之,除了手动执行SQL或运行类似的SQL命令并使用现有命令附加限制之外,将自己的方法写入Linq到实体的唯一方法是从EntityFramework.dll源手动修改和构建自己的EF6。
发布于 2013-07-31 11:26:55
我不清楚你的问题。但是,如果您的问题是无法使用自己的方法或其他linq方法,只需使用.AsEnumerable()
,并通过linq执行其他工作,而不是L2E:
myQuery.AsEnumerable().Where(entity => entity.Contains('foo', SearchFlags.All))
如果您需要在其他地方多次使用myQuery
,首先将其加载到内存中,然后任意使用它:
var myQuery = from e in context.myEntities
select d;
myQuery.Load();
// ...
var myOtherQuery = from d in context.myEntities.Local
select d;
// Now any L2O method is supported...
https://stackoverflow.com/questions/17401495
复制相似问题