2016-05-18 6 views
0

I以下の2つのEFのモデルがあります:は「メソッド構文」の代わりの「照会構文」へ照会

public class Rule 
{ 
    public int Id { get; set; } 
    public string RuleValue { get; set; } 
    public bool IsActive { get; set; } 
    public List<Exclusion> Exclusions { get; set; } 
} 

public class Exclusion 
{ 
    public int Id { get; set; } 
    public int ApplicationId { get; set; } 
    public int SiteId { get; set; } 
    public int RuleId { get; set; } 
    [ForeignKey("RuleId")] 
    public Rule Rule { get; set; } 
} 

私は唯一の場所のリストを返すようにデータベースを照会したいです関連付けられたRuleIdに基づいて、また指定されたApplicationIdとSiteIdに関連するレコードは、Exclusionsテーブルにはありません。最終的に、私が返す結果にそれらのルールを含まないように、アプリケーション/サイト固有の除外を考慮に入れてください。

私は次のクエリ使用して、これまでにこれを達成することができました:私は常に他のどこでもメソッド構文を使用し、一貫性を保つため

IQueryable<Rule> query = 
         from r in context.Rule 
         where r.IsActive && !(from e in context.Exclusion 
               where e.ApplicationId == applicationId && 
e.SiteId == siteId 
               select e.RuleId) 
           .Contains(r.Id) 
         select r; 

は、クエリの構文を使用していますこの1つのだけの方法を持ってしたくありません私はMethod Syntaxを使って同じことを働かせることができませんでした。

答えて

1

Exclusion(context.Exclusions)ではなく、このルール(r.Exclusions)の除外項目に移動して現在のルールでフィルタリングしていないのはなぜですか?私はあなたが何をすべきあなたの条件の権利を理解している場合、これは非常に後方

です:

var query = context.Rule 
    .Where(r=>r.IsActive) 
    .Where(r=>!r.Exclusions.Any(e=>e.ApplicationId == applicationId && e.SiteId == siteId); 
+0

あなたのコードでこのアプローチを試しましたが、間違った結果を返していましたが、2つの.Where()節ではなく、代わりに.Where(r => r.IsActive &&!r.Exclusions私は期待どおりの結果を得始めました。完璧、ありがとう!私はQuery構文に頼る前にこのアプローチを試したと確信していますが、少し間違っているはずです!再度、感謝します。 – marcusstarnes

+1

.Where(x).Where(y)は.Where(x && y)と等しくなります。同じ結果が得られるはずです –

0

は直接翻訳:

IQueryable<Rule> query = context.Rule 
    .Where(r => r.IsActive && !context.Exclusion 
     .Where(e => e.ApplicationId == applicationId && e.SiteId == siteId) 
     .Select(e => e.RuleId) 
     .Contains(r.Id) 
    ) 
    .Select(r => r); 

しかし、あなたは、もちろん同じように(恒等関数で選択を省略することができますコンパイラはおそらく):

IQueryable<Rule> query = context.Rule 
    .Where(r => r.IsActive && !context.Exclusion 
     .Where(e => e.ApplicationId == applicationId && e.SiteId == siteId) 
     .Select(e => e.RuleId) 
     .Contains(r.Id) 
    ); 
+0

SiteIdがありませんか? – user6144226

+0

@ user6144226ありがとうございます。一定。 –

0
var query = context.Rule.Where(r => r.IsActive && !context.Exclusion.Any(e => e.ApplicationId == applicationId && e.SiteId==siteId && r.Id==e.RuleId)) 
+1

あなたのコードに合った説明を加えて、問題解決のための理由を説明して、あなたの答えを改善してください。 – bwegs