我正在使用 EF4 开发 ASP.NET MVC 3 应用程序。我有大约 50,000 个实体,我正在通过 LINQ 查询它们以找到最符合给定搜索条件的内容。有多个搜索标准(最多约 12 个),这些是逐步匹配的。
例如:50,000 名学生
获取年龄范围内的学生 -> A
从 A 中获取男学生 -> B
- 从 B 获取已注册课程 CS101 -> C 的学生
实现这一目标的最佳方法是什么?
我正在使用 EF4 开发 ASP.NET MVC 3 应用程序。我有大约 50,000 个实体,我正在通过 LINQ 查询它们以找到最符合给定搜索条件的内容。有多个搜索标准(最多约 12 个),这些是逐步匹配的。
例如:50,000 名学生
获取年龄范围内的学生 -> A
从 A 中获取男学生 -> B
实现这一目标的最佳方法是什么?
一步一步对 SQL 来说意义不大,您的 linq 查询将转换为 sql 以查询数据库...
所以
//I'm a IQueryable
var queryableStudents =
students.Where(m =>
m.Age > 10 &&
m.Gender == 'm' &&
m.CourseList.Any(x => x.Name == 'CS101');
//I'm no more an IQueryable
var result = queryableStudents.ToList();//the query will be sent to db and result returned.
但如果搜索条件是可选的,你可以这样做
//I'm a IQueryable
var queryableStudents = students;
if (searchCriteria.Age > 0)
//I'm still a IQueryable
queryableStudents = queryableStudents.Where(m => m.Age => searchCriteria.Age);
if (!String.IsNullOrEmpty(searchCriteria.Gender))
//I'm still a IQueryable
queryableStudents = queryableStudents.Where(m => m.Gender == searchCriteria.Gender);
//Now I'm no more an IQueryable
var result = queryableStudents.ToList()//the query will be sent to db and result returned.
如果你想要一个“真实的”一步一步,(显示每一步的结果),你可以做
//I'm not an IQueryable
var a= students.Where(m => m.Age > 10).ToList();//you will get all students from your db who respect your first criterion, and then work on an IEnumerable, not an IQueryable.
//I'm not IQueryable
var b= a.Where(m => m.Gender == 'm');
//I'm not an IQueryable
var c= b.Where(m => m.CourseList.Any(x => x.Name == "CS101");
回答我自己的问题 - 经过一番思考,我发现最有效的方法是使用ElasticSearch之类的东西来索引我想要的条目。
给定的用例对于 LINQ/C# 来说不是一个很好的用例。
var A = from s in students
where ((s.age < max) && (s.age > min))
select s;
var B = from a in A
where (a.gender.Equals("Male"))
select a;
var C = from b in B
where (b.EnrolledCourses().Contains("CS101"))
select b;