实体框架4:搜索的最佳实践?

时间:2013-01-10 12:21:16

标签: asp.net-mvc entity-framework

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

Ex:50,000名学生

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

  2. 从A,获得男性学生 - >乙

  3. 从B,获得报名参加CS101课程的学生 - > ç
  4. 实现这一目标的最佳方式是什么?

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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;

答案 2 :(得分:0)

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

对于LINQ / C#,给定的用例不是很好。