我正在开发一个带有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' –