从Subsonic Collections获取子集

时间:2009-06-05 18:48:01

标签: asp.net collections controls subsonic

我正在使用Subsonic Collections从我们的数据库中提取时间表条目列表,然后将它们数据绑定到我在页面上创建的ASP.net用户控件。

是否可以根据某个参数将一个大型集合分成多个子集?

例如,我们的每个时间表条目都包含与其相关的特定作业的作业代码。我想通过他们的employeeid在指定的时间范围内为特定员工提取一大笔条目。然后我会根据条目的作业代码将该集合分成多个较小的集合,这样我就可以根据条目共享的作业代码自由地将不同的集合绑定到不同的控件。

这也很好,因为我不需要首先提取员工拥有数据的工作代码列表,然后运行多个数据库调用来填充每个集合(qry.AddWhere(“job_code”,job_code); qry.ExecuteReader())

3 个答案:

答案 0 :(得分:1)

您可以使用LINQ对大型集合进行切片,并将其用作网格的数据源。像这样:

var dbResults = new TimesheetCollection()
    .Where(Timesheet.Columns.EmployeeID, empId)
    .Load();

grid1.DataSource = dbResults.Where(t => t.JobCode == jc1);
grid2.DataSource = dbResults.Where(t => t.JobCode == jc2);

这样您就不会多次访问数据库了。您可以通过以下方式获取员工的工作代码列表:

// IEnumerable<int> of jobs
var jobs = dbResults.Select(t => t.JobCode).Distinct();

但是,请注意,如果重要的话,网格DataSource现在是IEnumerable<Timesheet>而不是TimesheetCollection对象。

答案 1 :(得分:0)

应该能够做到这一点

Dim bigCollection as TimeSheetCollection
Dim job1Collection as New TimeSheetCollection = Nothing
Dim job2Collection as New TimeSheetCollection = Nothing

bigCollection = New TimeSheetCollection().Where("employeeid",employeeID).Load()
job1Collection = bigCollection.Where("job_code",jc1).Load()
job2Collection = bigCollection.Where("job_code",jc2).Load()

答案 2 :(得分:0)

对于延迟回复感到抱歉,我没有正确设置问题所以我会收到任何回复的通知,然后我最终忘记了所有帖子!当我再次研究这个话题时,我发现了我的问题。

科里,

Load()似乎从数据库中提取更多记录并将它们附加到集合中。

我有一个包含14行的表。其中5行具有“MEAL”类型,其他9行具有“OTHER”类型。当我运行以下代码时:

Dim allActivities As New OnsScheduleActivityCollection
allActivities.LoadAndCloseReader(OnsScheduleActivity.FetchAll())

Dim justMeals As New OnsScheduleActivityCollection
justMeals = allActivities.Where("ActivityType", "MEAL").Load()

Response.Write(allActivities.Count & "<br />")
Response.Write(justMeals.Count & "<br />")

响应显示:19 19

当我使用Filter()代替Load()时,响应显示: 5 5

除了我实际上并不想修改主要集合之外,我会想要获得我存储在新集合中的子集(justMeals),但是将主集合(allActivities)保留在其原始状态中我想要的结果是让响应显示“14 5”。 14表示allActivies中的行数和justMeals中的5行。

这一切都可能吗?

麦克