有没有办法为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无法识别方法'布尔值 CONTAINS(System.Object,System.String,SearchFlags)'方法,以及此方法 无法翻译成商店表达。
要明确,我不想这样做:
myQuery.AsEnumerable().Where(entity => entity.Contains('foo', SearchFlags.All))
因为我希望能够在SQL空间中执行代码而不是手动返回所有实体。
我也无法使用.ToString()
的{{1}}并手动执行它,因为我需要实体框架来填充多个IQueryable
联接中的对象。
答案 0 :(得分:0)
我不明白你的问题。但是,如果您的问题是您不能使用自己的方法或其他linq to objects方法,只需使用.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...
答案 1 :(得分:0)
我最终做了以下事情(虽然有效,但距离完美还很远):
IEntity
long Id { get; set; }
context.myEntities.Where(entity => entity.Id != 0)
这是
因为身份从1开始是多余的,但Linq2Entities没有
知道那个。.ToString()
上致电IQueryable
我的其他查询,因为它返回类型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-to-Entities的唯一方法是手动更改和构建自己的EntityFramework。来自EF6源的dll。