2013-01-10 69 views
0

我正在开发一个带有EF4的ASP.NET MVC 3应用程序。我有大约5万个实体,我通过LINQ查询它们以查找与给定搜索条件最匹配的实体。有多个搜索标准(最多约12个),这些是一步一步的基础。实体框架4:搜索的最佳实践?

例:50,000名学生

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

  2. 从A,了解谁是男学生 - “乙

  3. 从B,得到学生谁注册课程CS101 - > C

什么是最好的方式来实现这一目标?

回答

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"); 
+0

您可以通过编写查询扩展来扩展此方法,以允许重复使用小查询片段(最多一点 - 如果您的自定义方法变得更复杂)。请参阅Jimmy Bogard的博客,以获取此示例:http://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/(以及它参考的Ayende文章) –

+0

m => m。年龄=> searchCriteria.Age?不应该检查一个年龄是否在范围内? – CloudyMarble

+0

@MeNoMore好吧,这只是一个例子,并非所有标准的确切答案。其实,是的,这应该是像'm.Age> = searchCriteria.MinAge && m.Age <= searchCriteria.MaxAge' –

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; 
0

回答我的问题 - 毕竟有些人认为我想通了,这样做是使用类似ElasticSearch索引我想要的条目的最effiecient方式。

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