表值参数可加入IQueryable

时间:2017-05-09 09:01:35

标签: entity-framework entity-framework-6

因此,出于各种原因,我们需要向EF6查询发送大量的ID。

queryable.Where(x => list.Contains(x.Id));

并不理想,因为它会创建一个庞大的列表。

所以我在想,是否有可能使用ids传递一个表值参数并获得一个可以加入的IQueryable回来?

类似(伪代码)

var queryable = TableValueToIQueryable<MyTableValueType>(ids);
context.Set<MyEntity>().Join(queryable, x => x.Id, x.Value, (entity, id) => entity);

这有可能吗?

更新:我已经能够使用EntityFramework.CodeFirstStoreFunctions执行sql函数并将数据映射到IQueryable<MyEntity>。它使用CreateQueryObjectParameters,我可以用ObjectParamters以某种方式使用表值参数吗?

update2: Set()。SqlQuery(...)将使用Table值参数,但生成的DbSqlQuery在SQL中不能以IQueryably连接,因此结果将是两个连接并且加入是在内存中完成的

var idResult = Set<IdFilter>().SqlQuery("select * from GetIdFilter(@ids)", parameter);
var companies = idResult.Join(Set<tblCompany>(), x => x.Id, y => y.CompanyID, (filter, company) => company).ToList();

update3: ExecuteStoreQuery

 ((IObjectContextAdapter)ctx).ObjectContext.ExecuteStoreQuery<InvoicePoolingContext.IdFilter>("select * from dbo.GetIdFilter(@ids)", parameter)
   .Join(ctx.Set<tblCompany>(), x => x.Id, y => y.CompanyID, (filter, company) => company).ToList();

给出错误:

  

已经有一个与此命令关联的开放DataReader   必须先关闭。

0 个答案:

没有答案
相关问题