2017-11-12 20 views
2

良い一日にLINQの拡張メソッドは、

をない選択私は、LINQの拡張メソッドで働いている、と私は私にはない、いくつかのコースを除いて、私のテーブルのコースから項目のリストを抽出するために必要なテーブルを持っています欲しいです。

public class Course 
{ 
    public Course() 
    { 
     Tags = new HashSet<Tag>(); 
    } 

    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public int Level { get; set; } 

    public float FullPrice { get; set; } 

    public virtual Author Author { get; set; } 

    public int AuthorId { get; set; } 

} 

これは私がこれまでにやっていることです:

//Get some courses that I do not need. 
var coursesDontNeed=_dbContext.courses.where(//here goes condition); 
     var coursesINeed= _dbContext.Courses.Except(coursesDontNeed); 

ではなく、二つの異なるLINQ文を書くのは、データベースへのただ一つのアクセスでそれを作るための方法はありますか?

おかげ

答えて

2

LINQクエリ式を作成し、を評価/実行しないでを作成することはできますが、2番目のLINQクエリで使用します。

var courseIdsDontNeed= db.Courses.Where(yourWherePredicateGoesHere).Select(a => a.Id); 
var coursesINeed = db.Courses.Where(p => !courseIdsDontNeed.Contains(p.Id)).ToList(); 

あなたは二LINQクエリのToList()またはToArray()を呼び出すと、LINQの式が実行され、(これらのアイテムを除外するためにフィルタリングロジックを持っている)のみ1つのSQL文があるでしょう生成され、実行dbに対して

yourWherePredicateGoesHereをフィルタする実際の述語に置き換えてください。たとえば、

var courseIdsDontNeed= db.Courses.Where(a=>a.IsActive).Select(a => a.Id); 
1

リストとして表さ_dbContext.Coursesを格納し、その上で動作するため、一時的な変数を作成します。この場合

var temp = _dbContext.Courses.ToList(); 
var coursesDontNeed = temp.Where(condition)... 
var coursesINeed = temp.Except(coursesDontNeed); 

、我々は唯一の_dbContextへの単一のアクセスを作成し、そこから私たちは_dbContextから任意のデータを要求する必要はありませんで。