2016-08-30 1 views
1

私は、次のプロパティを持つDBクラスを持っている:計算されたプロパティでフィルタリングされたEntity Frameworkを使用して、DBからクラスのリストを取得しますか?

public string AwsS3Key { get; set; } 
public bool PendingS3Upload => !string.IsNullOrEmpty(AwsS3Key); 

私はPendingS3Uploadプロパティに基づいてフィルタリングすることにより、私のコンテキストからのデータのリストを引くしようとしています。しかし、私は次のエラーを取得する:

The specified type member 'PendingS3Upload' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

どのように私は、「計算された」プロパティPendingS3Uploadに対する私のテーブルからデータを取得することができますか?

答えて

1

あなたのマークを付けることができますプロパティーには[NotMapped]属性が含まれています。これをデータベースレベルで照会することはできませんが、一部のユースケースではToList()またはAsEnumnerable()を使用するメモリでのみクエリできますが、これは大きなデータセットなどのために問題になりません。

SQL Serverを使用していると仮定すると、計算列を使用できます。

Computed Column Info

あなたは、これはコードファーストになりたいなら、あなたはあなたがデータベースまたは移行を初期化するとき、いくつかのSQLを実行する必要があります。私はDBにマップするプロパティを強制するため

ALTER TABLE dbo.TableName 
ADD PendingS3Upload AS (CAST(CASE WHEN AwsS3Key <> '' = 1 THEN 1 ELSE 0 END AS BIT)) 

その後

[DatabaseGenerated(DatabaseGenerationOption.Computed)] 
public bool PendingS3Upload { get; private set;} 

(民間セットが動作する場合、私は覚えていないこと)

+0

ああ。作成した計算列について、具体的にはコード・ファースト・アプローチからどのように進んでいきますか? –

+0

@DanielBrown私は自分の答えを更新しました。 – SimonGates

0

LINQは計算されたプロパティをSQL文に変換できないため、そのエラーが発生しています。これには2つの選択肢があります。あなたは(ToListメソッドを使用して、ローカルにデータを取得)し、このようにフィルタを適用することができます。

var result = Context.YourClass.ToList().Where(c => c.PendingS3Upload).ToList(); 

か、LINQは、次のように扱うことができる何かにロジックを翻訳することができます

var result = Context.YourClass.Where(c => !string.IsNullOrEmpty(c.AwsS3Key)).ToList(); 
+0

にあなたのクラスのプロパティを変更するには、それが可能ですプロパティをフィルタリングし続けますか?あなたが言及したオプションのどれもそれほど望ましいものではありません。 –

関連する問題