【问题标题】:How to convert DbSet in Entity framework to ObjectQuery如何将实体框架中的 DbSet 转换为 ObjectQuery
【发布时间】:2012-06-28 20:08:31
【问题描述】:

我正在使用 CodeFirst 方法,但遇到了需要将 DbSet 转换为 ObjectQuery 的问题。 这就是我为转换所做的。

ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext;
ObjectSet<Request> objectSet = objectContext.CreateObjectSet<Request>();

其中 db 是从 DbContext 继承的上下文,Request 是类。

所以,当我尝试调用期望 ObjectQuery 为 ObjectQueryMethod(objectSet) 的方法时,它会引发以下错误。

“由于'System.Data.Entity.DbSet'和'System.Data.Objects.ObjectQuery'之间没有隐式转换,无法确定条件表达式的类型”

非常感谢任何帮助!

【问题讨论】:

  • 为什么需要将 DbSet 转换为 ObjectQuery?
  • 提供更多详细信息 - ObjectQueryMethod 是什么?你目前的做法是正确的。您无法将 DbSet 转换为 ObjectQuery。您必须创建 ObjectSet 并使用它而不是 DbSet
  • @Kittoes:我正在尝试在 JQGrid 中实现高级搜索,而 ObjectQuery 似乎是解析发送回服务器的参数(过滤器)的正确方法。
  • @LadislavMrnka:这只是一个期望 ObjectQuery 作为参数的方法(这样命名):)
  • 感谢大家的宝贵时间。我发现我缺少什么,我需要将 DbSet("Requests") 作为 ObjectSet objectSet = objectContext.CreateObjectSet("Requests"); 传递给 ObjectSet

标签: entity-framework-4 linq-to-entities ef-code-first dbcontext


【解决方案1】:

我找到了答案。当然,也可以使用下面这几行代码将Entity框架中的DbSet转换为ObjectQuery。

ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext;  
ObjectSet<Request> objectSet = objectContext.CreateObjectSet<Request>("Requests");

在哪里,

  • db - 继承自 DbContext 的上下文类。
  • Requests - DbSet&lt;Request&gt; 在 Context 类中定义。
  • objectSet - 现在可以传递为 ObjectQuery

【讨论】:

  • AFAIK 您可以将字符串作为参数保留,这样可以减少错误提示:objectContext.CreateObjectSet&lt;Request&gt;();
【解决方案2】:

感谢“启发我自己”的正确答案;这只是为了详细说明您的答案。我设法用一个泛型类型来做到这一点,所以只是为了分享它:

private List<T> GetByCustomCriteria<T>(string criteria) where T: class
{
  var objectContext = ((IObjectContextAdapter)_myModelEntities).ObjectContext;
  //note: _myModelEntities is a DbContext in EF6.
  var objectSet = objectContext.CreateObjectSet<T>();
  return new List<T>(objectSet.Where(criteria));
 }

我认为上面的帖子可以举例说明发送什么标准,所以这里有一个例子:

 //sample criteria for int field:
 var myClientById = GetByCustomCriteria<Client>("it.Id == 1");`

//sample criteria for string field, note the single quotes
var myClientByName = GetByCustomCriteria<Client>("it.Surname == 'Simpson'"); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多