1

私はリストを持っています:

List<Student> lstStudents = GetConditionalStudents();

別のリストがあります:

List<School> allSchools  = dbContext.Schools.ToList();

すべての学校には生徒のリストがあります

public class School
{
   ///other properties
   public List<Student> {get;set;}
}

私はこれを行うことを余儀なくされています:

List<School> schools = from p in allSchools
                       where p.LocationId==this.LocationId
                       where p.Students.Any(d=>lstStudents.Contains(d))
                       select p;

しかし、それは機能しません: エラーが発生します

unable to create a constant value for .. only primitive types

編集

これを行うことで機能させることができます:

List<int> integers = lstStudents.Select(s=>s.Id).ToList();
List<School> schools = from p in allSchools
                       where p.LocationId == this.LocationId
                       where p.Students.Any(d=>integers.Contains(d.Id))
                       select p;

しかし、私はそれを使用したくありません.2つ以上のIDを比較しなければならない状況があるので、2つ以上を別々primitive datatype Listにしてクエリで使用する必要があります. .

linqクエリで外部リストを直接使用する方法.??

私はこれを使用できません:

allSchools.Where(s=>s.LocationId==this.LocationId ||
lstStudents.Contains(s)).ToList();

助けてください...私はこれこれを経験しました..しかし、それらは私にとって何の助けにもなりません..

4

2 に答える 2

1

問題は、Entity Frameworkが学生のリストを有効なSQLステートメントに変換できないことです。明らかにデータベースサーバーはクラスについて何も知らないStudentため、EntityFrameworkはLINQクエリをデータベースサーバーが理解できるものに変換できません。3つの解決策があります。

  1. メソッドを削除GetConditionalStudents()し、可能であれば、このリストを作成するクエリをメインクエリに直接含めます。

  2. それぞれのクエリを呼び出して両方のリスト(lstStudentsおよびallSchools)をメモリにフェッチし、LINQtoObjectsを使用して両方のリストを処理します。ToList()

  3. INEntity Frameworkは整数や文字列などのリストをステートメントに変換できるため、オブジェクトの代わりにオブジェクトIDを使用してください。

私には、あなたはすでにオプション2を実行しているように見えますが、明らかにコードが失敗したためではありませんが、正確な欠陥を特定することはできません。

于 2013-02-16T00:39:15.733 に答える
0

試す:

var schools = from p in allSchools
              where (p.LocationId==this.LocationId && p.Students.Any(s => lstStudents.Contains(s)))
              select p;
于 2013-02-15T23:13:03.857 に答える