2017-11-24 4 views
1

ナビゲーションプロパティSettingsと読み取り専用プロパティIsVisibleInAppを持つUserクラスがあります。エンティティフレームワークコアLINQクラスプロパティ/メソッドは使用できません含まれているプロパティ

var users = context.Users.Include(x => x.Settings) 
    .Where(x => x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2); 

しかし、私は頻繁にこれらのチェックを使用する必要がありますので、私はプロパティを使用しようと、それは、実行時にNULLとしてSettingsを取得します。

現時点では、このコードは動作します。

ここに私のコードです。

public bool IsVisibleInApp 
{ 
    get 
    { 
    return this.Settings.IsApproved && this.Settings.IsAvailable && this.UserType == 2; 
    } 
} 

... 
... 

void SomeMethod(){ 
    var users = context.Users.Include(x => x.Settings) 
     .Where(x => x.IsVisibleInApp).ToList(); 

外部キーthis.SettingsIDが有効な値であることがわかります。私はプロパティ/メソッドWhere節で使用することはできませんDBSetsのSQLに変換されると思いますか? しかし、確かにこれを回避する方法があります...または、.ToList()を最初に実行してから、さらに.Whereコールを使用する必要がありますが、それはデータベースからすべての行を取り出すことを意味します。 。

+0

私はあなたがあなた自身の質問に答えだと思います。なぜあなたのデータベースはC#コードを強調していないのですか、それともLINQがC#コードをランダムにSQLに変換しようとしますか?元のラムダは変換できますが、プロパティのゲッターは変換できません。それがうまくいけば、次にそのゲッターの別のデータベースにサービスコールやI/Oを組み込み、それでもあなたのDBサーバー上ですべてが実行されることを期待していますか? – oerkelens

答えて

1

あなたは(EFがあなたのプロパティのゲッターの内側に移動して、あなたがそこに何をしているか見ていないだろう)それをあなたが望むように行うことはできませんが、静的な表現でそれをラップすることにより、コードの重複を減らすことができます。

public static Expression<Func<User, bool>> IsVisibleInAppExpression = x => 
    x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2; 

次に、このように使用してください:

var users = context.Users.Include(x => x.Settings) 
    .Where(User.IsVisibleInAppExpression).ToList(); 

または拡張メソッドを作成することでは:

このような
public static class Extensions { 
    public static IQueryable<User> VisibleInAppOnly(this IQueryable<User> query) 
    { 
     return query.Where(x => 
      x.Settings.IsApproved && x.Settings.IsAvailable && x.UserType == 2); 
    } 
} 

と使用:

var users = context.Users.Include(x => x.Settings).VisibleInAppOnly(); 
関連する問題