我正在開發一個帶有EF4的ASP.NET MVC 3應用程序。我有大約5萬個實體,我通過LINQ查詢它們以查找與給定搜索條件最匹配的實體。有多個搜索標準(最多約12個),這些是一步一步的基礎。實體框架4:搜索的最佳實踐?
例:50,000名學生
獲取的年齡範圍內的學生 - >一個
從A,瞭解誰是男學生 - 「乙
- 從B,得到學生誰註冊課程CS101 - > C
什麼是最好的方式來實現這一目標?
我正在開發一個帶有EF4的ASP.NET MVC 3應用程序。我有大約5萬個實體,我通過LINQ查詢它們以查找與給定搜索條件最匹配的實體。有多個搜索標準(最多約12個),這些是一步一步的基礎。實體框架4:搜索的最佳實踐?
例:50,000名學生
獲取的年齡範圍內的學生 - >一個
從A,瞭解誰是男學生 - 「乙
什麼是最好的方式來實現這一目標?
一步一步並不意味着很多關於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");
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;
回答我的問題 - 畢竟有些人認爲我想通了,這樣做是使用類似ElasticSearch索引我想要的條目的最effiecient方式。
給定的用例對於LINQ/C#來說不是很好的用例。
您可以通過編寫查詢擴展來擴展此方法,以允許重複使用小查詢片段(最多一點 - 如果您的自定義方法變得更復雜)。請參閱Jimmy Bogard的博客,以獲取此示例:http://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/(以及它參考的Ayende文章) –
m => m。年齡=> searchCriteria.Age?不應該檢查一個年齡是否在範圍內? – CloudyMarble
@MeNoMore好吧,這只是一個例子,並非所有標準的確切答案。其實,是的,這應該是像'm.Age> = searchCriteria.MinAge && m.Age <= searchCriteria.MaxAge' –