如何将Entity Framework中的DbSet转换为ObjectQuery

12

我正在使用CodeFirst方法,遇到了一个问题,需要将DbSet转换为ObjectQuery。以下是我进行转换的方法。

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

这里的db是从DbContext继承而来的上下文,Request是一个类。

当我尝试调用期望ObjectQuery作为参数的方法ObjectQueryMethod(objectSet)时,它会抛出以下错误:

"Type of conditional expression cannot be determined because there is no implicit conversion between 'System.Data.Entity.DbSet<>' and 'System.Data.Objects.ObjectQuery<>'"

非常感谢你的帮助!


为什么需要将DbSet转换为ObjectQuery? - Kittoes0124
请提供更多细节 - ObjectQueryMethod 是什么?您当前的方法是正确的。您不能将 DbSet 转换为 ObjectQuery。您必须创建 ObjectSet 并使用它来代替 DbSet - Ladislav Mrnka
@Kittoes:我正在尝试在JQGrid中实现高级搜索,ObjectQuery似乎是解析发送回服务器的参数(过滤器)的正确方法。 - inspiringmyself
@LadislavMrnka:这只是一个期望ObjectQuery作为参数的方法(命名为此) :) - inspiringmyself
感谢大家抽出时间。我找到了自己缺失的部分,我需要将DbSet("Requests")传递给ObjectSet作为ObjectSet<Request>对象集合 = objectContext.CreateObjectSet<Request>("Requests"); - inspiringmyself
2个回答

23

我找到了答案。当然,可以使用以下代码将 Entity Framework 中的 DbSet 转换为 ObjectQuery。

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

其中,

  • db - 继承自DbContext的上下文类。
  • Requests - 在上下文类中定义的DbSet<Request>
  • objectSet - 现在可以作为ObjectQuery传递。

5
据我所知,您可以将字符串作为参数留空,这样做可以减少错误的可能性: objectContext.CreateObjectSet<Request>(); - Yahoo Serious

2

感谢“inspiringmyself”提供的正确答案,这里只是对您的答案进行详细说明。我使用了通用类型来实现这个,现在分享给大家:

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'"); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接