我正在使用EF4开发ASP.NET MVC 3应用程序。我有大约50,000个实体,我通过LINQ查询它们,以找到与给定搜索条件最匹配的实体。有多个搜索标准(最多约12个),这些是逐步基础的matcheon。
Ex:50,000名学生
让年龄范围内的学生 - > A
从A,获得男性学生 - >乙
实现这一目标的最佳方式是什么?
答案 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#,给定的用例不是很好。