EF4を使用してASP.NETMVC3アプリケーションを開発しています。私は約50,000のエンティティを持っており、LINQを介してそれらをクエリして、指定された検索条件に最も一致するものを見つけています。複数の検索基準(最大約12)があり、これらは段階的に一致します。
例:50,000人の学生
年齢範囲内の学生を取得->A
Aから、男性の生徒を取得します-> B
- Bから、コースCS101->Cに登録している学生を取得します
これを達成するための最良の方法は何ですか?
EF4を使用してASP.NETMVC3アプリケーションを開発しています。私は約50,000のエンティティを持っており、LINQを介してそれらをクエリして、指定された検索条件に最も一致するものを見つけています。複数の検索基準(最大約12)があり、これらは段階的に一致します。
例:50,000人の学生
年齢範囲内の学生を取得->A
Aから、男性の生徒を取得します-> B
これを達成するための最良の方法は何ですか?
ステップバイステップは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のようなものを使用して必要なエントリにインデックスを付けることです。
与えられたユースケースは、LINQ / C#にはあまり適していません。