14

私は旗を持っています例えば

[Flags]
public enum DaysOfTheWeek
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}

Linqを使用して特定のフラグを含む変数に基づいてフィルタリングする場合は、ラムダステートメントでEnum.HasFlagを使用して、複数のフラグをフィルタリングすることができます。

DaysOfWeek weekendFilter = DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday;
var weekends = allDays.Where(d => d.DayOfWeek.HasFlag(weekendFilter));

これは現在:

LINQ to Entitiesは、メソッド'Boolean HasFlag(System.Enum)'メソッドを認識せず、このメソッドをストア式に変換できません。

4

3 に答える 3

25

列挙型フラグは二項演算に基づいています。

HasFlag = (allDays & (DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday)) != 0;

必要に応じて、これを拡張メソッドに抽象化できます。

あなたの質問に具体的に答えるには:

DaysOfWeek weekendFilter = DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday;
var weekends = allDays.Where(d => (d.DayOfWeek & weekendFilter) != 0);

この述語をLINQtoSQLで使用できることを私は知っています。SQLに変換されます(SQL Serverはバイナリ演算を問題なくサポートしています)。EFが同等に機能するかどうかはわかりません。LINQサポートは一般的にL2Sよりはるかに劣っています。

于 2012-09-06T19:17:21.093 に答える
5

EF6.1で修正されたようです。

ただし、EFコアについてはこちらをご確認ください。

于 2017-05-08T19:32:23.423 に答える
0

解決策は、@ usrの回答と、使用しているEntityFrameworkのバージョンの理解を組み合わせたものです。EF4は列挙型の保存をサポートしていないので、エンティティはintを保存しますか?また、オブジェクトの列挙型のプロパティはEFにマップされていません。列挙型のプロパティは、get/setのメンバーにマップされます。

例えば

public int? DayOfWeekValue { get; set; }
[NotMapped]
public DaysOfWeek DayOfWeek
{
    get { return (DaysOfWeek)DayOfWeekValue; }
    set { DayOfWeekValue= (int)value; }
}

@usrの回答によると、フィルターは2項演算で実行する必要があります。これは、バイトを拡張するフラグを設定することで実行できます

[Flags]
public enum DaysOfTheWeek : byte
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}

次に、値とフィルターをバイトとしてキャストして、2項演算を実行します。

var weekends = allDays.Where(d => (((byte)d.DayOfWeekValue.Value) & (byte)weekendFilter) != 0);
于 2012-09-07T12:05:44.070 に答える