2017-11-22 9 views
0

各コレクションはDepartureのプロパティでフィルタリングされ、それぞれのコレクションを含むDriverが返されます。EFコアには、コレクションの参照オブジェクトにフィルタを持つICollection <T>が含まれています。

このクエリ:

// id supplied by HTTP POST 
var driver = await _context.Drivers 
    .Include(d => d.Departures.Where(dd => dd.Acknowledged == false)) 
    .SingleOrDefaultAsync(m => m.ID == id); 

はエラーを生成します

InvalidOperationException: The property expression 'd => {from Departure dd in d.Departures where ([dd].Acknowledged == False) select [dd]}' is not valid. The expression should represent a property access: 't => t.MyProperty'. For more information on including related data, see http://go.microsoft.com/fwlink/?LinkID=746393 .

私は何を理解していないのですか?

public class Driver 
{ 
    public int ID { get; set; } 
    ... 
    public virtual ICollection<Departure> Departures { get; set; } 
} 

が出発:

モデル

  • Driverは、多くのDepartures
  • Departure 1つのDriver

ドライバを持ってい

public class Departure 
{ 
    public int ID { get; set; } 
    public Boolean Acknowledged { get; set; } 
    ... 
    public int DriverID { get; set; } 
    public virtual Driver Driver { get; set; } 
} 

Mac用VS StudioでEF Core 2.0を使用する。

+0

@ivanStoev唯一の答えはサイト外のディスカッションにつながるリンクオンリーなので、良い重複を選んだのかどうかはわかりません。多分もっと良い候補者はいますか? – dasblinkenlight

+0

@dasblinkenlightフィルタ処理されたインクルードは、最も求められるEF機能の1つです。そして、その答えは常に - サポートされていません。 EF6に実装される可能性はありませんが、EFコアの計画があるので、私が選んだ答えは、現時点でIMOの正しい答えです.EFCの問題追跡ツールへのリンクがあります。多くのEF6回避策はEFコアでは機能しないか、特定のEFCバージョンでは異なる動作をすることに注意してください。時々インクルードは無視され、時にはそうではありません。また、プロジェクショントリックが機能しない場合があります。個人的には、EFCステータスの監視やDTO/ViewModelsの使用に切り替える以外の方法はありません。 –

+0

@dasblinkenlightしかし、あなたは正しいです - 多くの複製が必要です。あなたが良いものを持っているなら、私はそれを使用して喜んでします。実際には、閉じるためにhttps://stackoverflow.com/questions/47440972/net-core-2-ef-includeをもう1つ持っています。これらは毎日2〜3日に到着しています:) –

答えて

0

あなたはDriverオブジェクト自体に逸脱をフィルタリングすることはできませんが、戻り値にそれらをフィルタリングすることができます:あなたは背中とnull結果-check driverAndDeparturesを得れば

var driverAndDepartures = await _context.Drivers 
    .Select(d => new { 
     Driver = d 
    , UnacknowledgedDepartures = d.Departures.Where(dd => !dd.Acknowledged).ToList() 
    }) 
    .SingleOrDefaultAsync(m => m.ID == id); 

は、あなたがdriverAndDepartures.Driverを介してドライバを入手することができますdriverAndDepartures.UnacknowledgedDepartures欄にも彼の未確認の出発点がある。

driverAndDepartures.Driver.Departuresを取得しようとすると、フィルタリングされていない出発点のコレクション全体が読み取られます。

関連する問題