0

我正在使用 EF4 开发 ASP.NET MVC 3 应用程序。我有大约 50,000 个实体,我正在通过 LINQ 查询它们以找到最符合给定搜索条件的内容。有多个搜索标准(最多约 12 个),这些是逐步匹配的。

例如:50,000 名学生

  1. 获取年龄范围内的学生 -> A

  2. 从 A 中获取男学生 -> B

  3. 从 B 获取已注册课程 CS101 -> C 的学生

实现这一目标的最佳方法是什么?

4

3 回答 3

2

一步一步对 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");
于 2013-01-10T12:38:45.703 回答
0

回答我自己的问题 - 经过一番思考,我发现最有效的方法是使用ElasticSearch之类的东西来索引我想要的条目。

给定的用例对于 LINQ/C# 来说不是一个很好的用例。

于 2014-01-25T03:07:52.200 回答
0
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;
于 2013-01-10T12:35:31.417 回答