向LINQ to Entities添加新方法

时间:2013-07-01 09:47:27

标签: sql-server entity-framework linq-to-entities

有没有办法为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联接中的对象。

2 个答案:

答案 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)

我最终做了以下事情(虽然有效,但距离完美还很远):

  1. 我的所有实体都来自定义IEntity
  2. long Id { get; set; }
  3. 然后我添加了一个冗余限制 context.myEntities.Where(entity => entity.Id != 0)这是 因为身份从1开始是多余的,但Linq2Entities没有 知道那个。
  4. 然后,在完成所有操作后,我在.ToString()上致电IQueryable 我的其他查询,因为它返回类型DBQuery<Entity> SQL命令文本,我用查询限制做了一个简单的替换。
  5. 为了让所有.Include(...)工作,我实际执行 两个不同的sql命令。没有其他更好的方法可以解决这个问题,因为查询执行计划缓存会导致问题(即使在禁用时)。
  6. 结果我的代码看起来像这样:

    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。