2013-01-10 117 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#來說不是很好的用例。