问题:如果我使用存储过程创建一个IQueryable<实体类型/复杂类型>对象,但我需要对存储过程执行结果进行过滤。因为某些原因,我不希望向存储过程传递参数。虽然我可以用URI:http://localhost:54321/Wcf/ZJ.svc/QueryTest?$filter = FacilityName eq 'PC'这种格式对结果进行过滤,但是我对这种方法存在顾虑
var context = new Entities();
var query = context.存储过程().AsQueryable();
query对象是否是先返回所有存储过程结果,然后再对结果集进行过滤?
comment:存储过程 select * from T_ZJ_Facility
我用EntitySql进行测试的结果
public IQueryable<T_ZJ_Facility> QueryTest()
{var context = new Entities();
var query = context.T_ZJ_Facility.AsQueryable();
return query.AsQueryable();}
我跟踪了sql执行记录,如下
SELECT
[Extent1].[FacilityId] AS [FacilityId],
[Extent1].[OrgCode] AS [OrgCode],
[Extent1].[FacilityCode] AS [FacilityCode],
[Extent1].[FacilityName] AS [FacilityName],
[Extent1].[FacilityType] AS [FacilityType],
[Extent1].[InstallPosition] AS [InstallPosition],
[Extent1].[FacilityFunction] AS [FacilityFunction],
[Extent1].[Frequency] AS [Frequency],
[Extent1].[ExecuteTimes] AS [ExecuteTimes],
[Extent1].[UseTime] AS [UseTime],
[Extent1].[FacilityStatus] AS [FacilityStatus],
[Extent1].[CreateBy] AS [CreateBy],
[Extent1].[CreateTime] AS [CreateTime],
[Extent1].[ModifyBy] AS [ModifyBy],
[Extent1].[ModifyTime] AS [ModifyTime]
FROM [dbo].[T_ZJ_Facility] AS [Extent1]
WHERE 'PC' = [Extent1].[FacilityName]
IQueryable<T> 返回的是关于数据源的表达式树,当我使用EntitySql,LINQ构造表达式树,返回的IQueryalbe<T>并不是数据而是表达式树。
问题:如果我使用实体类映射的存储过程构造query时,返回的IQueryable<T>是数据还是存储过程在实体模型映射的表达式树。
我跟踪了数据库执行记录,exec 存储过程名
实体类应该是不可以映射sql语句为表达式树,而表达式树是可以映射成sql语句。使用存储过程不能很好和IQueryable的接口进行完美兼容,特别在存储过程返回的数据量比较大时,而有效数据较少时。
当然可以将参数传递给存储过程来解决这个问题。
SELECT 哪些字段是由实体类以及映射关系的定义决定的。
如果查询结果没有你想要的字段,可以在实体类中添加相应的属性。
这个我是知道的,现在关心的是使用存储过程的效率。返回值AsQueryable类型,在调用是在前台可以使用
$filter,$top,$expand。。。对存储结果进行进一步的操作。我现在不知道我传入的这些条件是在数据库里执行还是在WCF服务里执行。
注:结果没问题,但是以后进行复杂查询操作和对前台调用的接口的兼容,希望使用存储过程不使用参数。
我也想尝试着Entity Framework 使用存储过程。