C# 实体框架-在非持久类上创建IQueryable
我有一个OData实体框架服务(EF5)。我有一个例子,我有一组数据库记录,需要在返回它们之前进行操作 具体来说,这是一个树状结构中的记录列表,该结构的信息在数据库中。我返回的数据集必须展平-因此我需要在内存中创建树,然后在处理后返回一个新的数据集(将所有内容按正确的顺序和格式排列)。虽然我显然需要从数据库中获取整个数据集(通常在50到400条记录之间,所以没什么大不了的),但我希望保持C# 实体框架-在非持久类上创建IQueryable,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个OData实体框架服务(EF5)。我有一个例子,我有一组数据库记录,需要在返回它们之前进行操作 具体来说,这是一个树状结构中的记录列表,该结构的信息在数据库中。我返回的数据集必须展平-因此我需要在内存中创建树,然后在处理后返回一个新的数据集(将所有内容按正确的顺序和格式排列)。虽然我显然需要从数据库中获取整个数据集(通常在50到400条记录之间,所以没什么大不了的),但我希望保持IQueryable功能,以便根据需要发送子集 我看了以下内容——这似乎表明这是可能的 我已经创建了一个新的服
IQueryable
功能,以便根据需要发送子集
我看了以下内容——这似乎表明这是可能的
我已经创建了一个新的服务来实现这一点,但是当服务启动时,它会抛出一个内部错误。任何关于是否可以这样做以及如何做的建议都将不胜感激
[WebGet]
public IQueryable<mobFlatSchedule> getSchedule(int projectID)
{
//get the records from the context
List<ScheduleItem> siList = CurrentDataSource.ScheduleItems.Where(x => x.ProjectID == projectID).ToList();
//convert the tree into a flat list of basic types
List<mobFlatSchedule> flatSIList = scheduleFlattener.CreateScheduleDatasource(siList);
return flatSIList.AsQueryable();
}
public class mobFlatSchedule
{
public int Level { get; set; }
public int lineType { get; set; }
public decimal? Qty { get; set; }
public decimal? QtySched { get; set; }
public decimal? Rate { get; set; }
public int ScheduleID { get; set; }
public int ProjectID { get; set; }
public string ScheduleNo { get; set; }
public string ScheduleDescription { get; set; }
public decimal? SchedTotal { get; set; }
public decimal? Total { get; set; }
public string Unit { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="mobFlatSchedule"/> class.
/// </summary>
public mobFlatSchedule(CivilPro.InfrastructureC.Schedule.FlatSchedule fs)
{
Level = fs.Level;
lineType = (int) fs.lineType;
Qty = fs.Qty1;
QtySched = fs.QtySched;
Rate = fs.Rate1;
ScheduleID = fs.Schedule.ScheduleID;
ProjectID = fs.Schedule.ProjectID.ProjectID;
ScheduleNo = fs.ScheduleNo;
ScheduleDescription = fs.ScheduleDescription;
SchedTotal = fs.SchedTotal;
Total = fs.Total1;
Unit = fs.Unit;
}
}
[WebGet]
公共IQueryable getSchedule(int projectID)
{
//从上下文中获取记录
List siList=CurrentDataSource.ScheduleItems.Where(x=>x.ProjectID==ProjectID.ToList();
//将树转换为基本类型的平面列表
List FlatsList=ScheduleFlatter.CreateScheduleDatasource(siList);
返回flatsList.AsQueryable();
}
公共课活动时间表
{
公共整数级别{get;set;}
公共int线型{get;set;}
公共小数?数量{get;set;}
公共十进制数?QtySched{get;set;}
公共十进制?速率{get;set;}
public int ScheduleID{get;set;}
公共int ProjectID{get;set;}
公共字符串ScheduleNo{get;set;}
公共字符串ScheduleDescription{get;set;}
公共十进制数?SchedTotal{get;set;}
公共小数?总计{get;set;}
公共字符串单元{get;set;}
///
///初始化类的新实例。
///
公共移动平台时间表(CivilPro.Infrastructure C.Schedule.FlatSchedule fs)
{
Level=fs.Level;
线型=(int)fs.lineType;
数量=fs.Qty1;
QtySched=fs.QtySched;
速率=fs.Rate1;
ScheduleID=fs.Schedule.ScheduleID;
ProjectID=fs.Schedule.ProjectID.ProjectID;
ScheduleNo=fs.ScheduleNo;
schedulescription=fs.schedulescription;
SchedTotal=fs.SchedTotal;
总计=fs.Total1;
单位=fs.单位;
}
}
IncludeCreateScheduleDatasource
请,您也可以通过调用ToList()
执行查询,稍后调用AsQueryable()
只会将其转换回IQueryable
。故意调用ToList。这是为了执行查询。所有数据都是编译树结构所必需的。然后将其处理到另一个类,实际上,如何处理与此无关。它被强制转换为iqueryable,因为我希望它可以启用自动实现take、skip等(似乎我不能)IncludeCreateScheduleDatasource
please,您也可以通过调用ToList()
,调用AsQueryable()来执行查询
稍后,它只是将其返回到一个IQueryable
。它是故意调用tolist的。这是为了执行查询。所有数据都是编译树结构所必需的。然后将其处理到另一个类,实际上,如何处理与此无关。它被转换为iqueryable,因为我希望它能够自动实现take、skip等(似乎我不能)