0

EF4を使用してASP.NETMVC3アプリケーションを開発しています。私は約50,000のエンティティを持っており、LINQを介してそれらをクエリして、指定された検索条件に最も一致するものを見つけています。複数の検索基準(最大約12)があり、これらは段階的に一致します。

例:50,000人の学生

  1. 年齢範囲内の学生を取得->A

  2. Aから、男性の生徒を取得します-> B

  3. Bから、コースCS101->Cに登録している学生を取得します

これを達成するための最良の方法は何ですか?

4

3 に答える 3

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");
于 2013-01-10T12:38:45.703 に答える
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;
于 2013-01-10T12:35:31.417 に答える
0

私自身の質問に答える-いくつか考えた後、これを行う最も効率的な方法は、ElasticSearchのようなものを使用して必要なエントリにインデックスを付けることです。

与えられたユースケースは、LINQ / C#にはあまり適していません。

于 2014-01-25T03:07:52.200 に答える