【问题标题】:Apply IQueryable to another IQueryable / DbContext将 IQueryable 应用到另一个 IQueryable / DbContext
【发布时间】:2015-07-01 06:07:07
【问题描述】:

我有一个IQueryable<Person>,它是根据一些输入参数(排序和过滤)创建的。

是否可以将此IQueryable<T> 应用于我在DbContext 中的DbSet<T>

例如:

// create the query from some parameters
IQueryable<Person> query = CreateQuery(parameters);

// apply the query somehow to an existing IQueryable / DbSet
AppContext db = new AppContext();
IEnumerable<Person> result = db.People.ApplyQuery(query).ToList();

【问题讨论】:

  • 不应该People 实际上是Person?它们真的是不同的类型吗?
  • db.People 的类型为 DbSet&lt;Person&gt;。 IQuerable 和 DbSet 具有相同的类型
  • 你能改变CreateQuery方法吗?我遇到了类似的问题,但通过创建基本查询 (Select(x =&gt; x)) 并根据提供的 parameters(如果有)添加过滤器和排序来解决它。
  • 我可以更改CreateQuery,使其接收现有的IQuerable,但一点也不优雅。 (另外因为在创建查询时我可能无法访问 DbContext。

标签: c# linq entity-framework linq-to-sql


【解决方案1】:

实际上上下文必须相同。 更糟糕的是,我在将 ToList 语句从 linq 查询内部移动到外部 linq 查询时遇到了问题,即

// myQuery is an IQueryable from a different context
// This did not work
IEnumerable<Person> result = db.People.Where(p => myQuery.ToList().Contains(p.Id)).ToList();

// This worked
myList = myQuery.ToList();
IEnumerable<Person> result = db.People.Where(p => myList.Contains(p.Id)).ToList(); 

真的很奇怪不是吗?

【讨论】:

  • 啊,抱歉这么晚回答:) 是的,很奇怪。直到现在才找到解决方案,我不得不改变策略
猜你喜欢
  • 2017-08-29
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多