因此,出于各种原因,我们需要向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>
。它使用CreateQuery
和ObjectParameters
,我可以用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 必须先关闭。