2016-12-30 7 views
2
 _context.Homestays 
       .Include(x => x.CreatedUser) 
       .Include(x => x.UpdatedUser) 
       .Include(x => x.HomestayEvaluations) 
       .Include(x => x.HomestayContracts) 
       .Include(x => x.HomestayPoliceChecks) 
       .Include(x => x.HomestayHouseHolds) 
       .AsNoTracking() 
       .Select(x => new Homestay() 
       { 
        HomestayId = x.HomestayId, 
        HomestayFamily = ConstValue.GetHomestayFamilyName(x), 
        Address = x.Address, 
        Score = x.HomestayEvaluations.Any(x1 => x1.IsEvaluationActive) ? x.HomestayEvaluations.LastOrDefault(x1 => x1.IsEvaluationActive).GetScore() : 0, 
        Contract = x.HomestayContracts.Any(x1 => x1.IsContractActive) ? x.HomestayContracts.LastOrDefault(x1 => x1.IsContractActive).ContractDate : null, 
        Students = x.Students, 
        HouseHolders = x.HomestayHouseHolds.Count(x1 => x1.IsHouseHoldActive), 
        PoliceCheck = x.HomestayPoliceChecks.Any(x1 => x1.IsPoliceCheckActive) ? x.HomestayPoliceChecks.LastOrDefault(x1 => x1.IsPoliceCheckActive).PoliceCheckDate : null, 
        Language = x.Language, 
        Room = x.Room, 
        IsActive = x.IsActive, 
        CreatedDate = x.CreatedDate, 
        CreatedUserName = ConstValue.GetUserName(x.CreatedUser), 
        UpdatedDate = x.UpdatedDate, 
        UpdatedUserName = ConstValue.GetUserName(x.UpdatedUser) 
       }) 
       .OrderByDescending(x => x.HomestayId); 

こんにちは、私の選択クエリをより良く変更するにはどうすればよいですか?EFコアのパフォーマンスの問題を選択

このコードは以下のように乱雑に見えます。 最初に実行し、それが真であれば、最後のものを取得します。それ以上の短いコードはありますか?

契約= x.HomestayContracts.Any(x1 => x1.IsContractActive)? x.HomestayContracts.LastOrDefault(x1 => x1.IsContractActive).ContractDate:null

私はany()なしで試してみましたが、データがない場合はnullオブジェクトとしてエラーが発生しました。

私を助けてください。

感謝:)

+0

ストアドプロシージャを作成し、ストアドプロシージャ – JaredStroeb

+0

[DefaultIfEmpty()]を見てみましょう(http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/02/c.net-little-wonders-を実行しますあなたがそれらを参照するので、すべての.Include()をダンプすることもできます(つまり、空のdefaultifemptyとcount.aspx) 'Contract = x.HomestayContracts.Where(x1 => x1.IsContractActive).DefaultIfEmpty()。LastOrDefault();'あなたの質問に。 –

+0

"デバッグ"ロギングを有効にし、コンソールからSQL Management Studio(または任意の他のツール)にSQLをコピーし、このSQLとそのクエリプランを調べます。 – Dmitry

答えて

0

使用この

Contract = x.HomestayContracts.LastOrDefault(x1 => x1.IsContractActive)?.ContractDate ?? null 

また、あなたは短い文を引き起こし、あなたは排除することができます。この方法では、メソッドを含めるコンテキストのコンフィギュレーション

context.Configuration.LazyLoadingEnabled = false; 

にこのクエリの遅延読み込みを無効にすることができますパフォーマンスは向上しません。パフォーマンスのためにストアドプロシージャを使用します。 Stored Procedure in Entity Framework

+0

契約= x.HomestayContracts.LastOrDefault(x1 => x1.IsContractActive)?ContractDate ?? nullは動作していません.......これはEFコアのためですか???????? –

+0

いいえ、そのC#6新機能。あなたのコードとの違いはありません。どちらも同じです。私のほうが少し短い。 –

+0

本当に???それは動作しません。 –