Linq根据数据库查询本地集合

本文关键字:集合 查询 数据库 Linq | 更新日期: 2023-09-27 18:18:53

我正在对数据库查询我的本地列表,想知道最好的方法是什么。

目前我正在加载我的数据库到内存,其中"选项"在本地列表

tmp.AddRange(from course in cs.studhists.Where(x => x.year == year).AsEnumerable()
                         from option in options.Where(x => x.type.Equals("course"))
                         join stud in cs.sstudents on course.studid equals stud.studid
                         where
                         course.csid.Contains(option.identifier) && course.crsinst.Contains(option.extra_identifier)
                         select stud);

"studhists"表有相当多的行,如果我没有选择只选择当前年份的选项,或者如果年份在选项对象内,它将需要一段时间加载到内存。

或者我可以循环遍历每个选项(这在我发现只加载当前年份的数据之前工作得快得多)。我没有计时,但我想它仍然在。

foreach (OptionListItem opt in options.Where(x => x.type.Equals("course")))
{
   tmp.AddRange(from course in cs.studhists
                join stud in cs.sstudents on course.studid equals stud.studid
                where course.year == year
                && course.csid.Contains(opt.identifier) && course.crsinst.Contains(opt.extra_identifier)
                select stud);
}

是否有一种方法可以创建临时表来保存"选项"并查询它?

或者我完全错过了一些其他的方法来做到这一点?

Linq根据数据库查询本地集合

因为您使用的是"Contains",所以很难,而且您可能需要使用PredicateBuilder:

动态构建查询。
var predicate = PredicateBuilder.False<Course>();
foreach(var opt in options.Where(x => x.type.Equals("course"))
{
    predicate = predicate.Or(course.csid.Contains(opt.identifier) && course.crsinst.Contains(opt.extra_identifier));
}

(谓词构建器页面上的第一个示例显示了一个类似的示例)