11

私は以下のような列挙型を持っています

  [Flags]
    public enum WeekDays
    {

        Monday = 1,
        Tuesday = 2,
        Wednesday = 4,
        Thursday = 8,
        Friday = 16,
        Saturday = 32,
        Sunday = 64,
    }


   WeekDays dw = WeekDays.Friday | WeekDays.Monday | WeekDays.Saturday;

   int dwInt = (int)dw;

   var list = query.Where(f => f.FromDateTime.DayOfWeek == dwInt "??????????? what can i do there????").ToList();
4

4 に答える 4

14

ソースにリストされている日をフィルタリングするためにクエリに何を入れるべきかわからなかったと推測します。

ソーススニペットを考えると、dwIntがビットマスクとして使用されていると推測しても安全だと思います。DayOfWeekには、特定の曜日を示す1つのビット位置が「設定」されます。これに基づいて、Where isで論理ビット単位のANDをdwIntを使用してDayOfWeekフィールドで実行し、結果が0より大きいことを確認します。これは、目的の曜日の1つである「ビット」がに設定されていることを意味します。ターゲットフィールド。私はこれがトリックをするだろうと信じています:

var list = query.Where(f => (f.FromDateTime.DayOfWeek & dwInt) >0).ToList()

私があなたの質問を間違って解釈したならば、許してください。

于 2012-04-25T19:57:18.687 に答える
8

[HasFlags] 属性は、.ToString() および (AFAIK) Enum.Parse() 操作以外には影響しないという意味で非常に興味深いものです。したがって、非文字列操作の場合、列挙型に [HasFlags] 属性があるかどうかは問題ではありません。EF で列挙型が機能する方法は、基になる型にキャストされ、int64、int32、int16、byte、sbyte のいずれかの整数型であるかのように扱われることです (符号なしの整数型は EDM でサポートされていないため、署名されていない基になる型の列挙型は機能せず、データベースの列挙型列は上記の型のいずれかに対応する型の列にすぎません)。これは、基本的に、(EF でサポートされている型の) 整数値で有効な演算は、コンパイラが許可しない限り、列挙値で有効であることを意味します (I don't 私はこのような操作を認識しているとは思いません)。これはまた、???? コンパイルすれば動作するはずです(Sql Serverはビット単位の操作をサポートしています)

于 2012-04-25T19:58:33.320 に答える
3

解決策はここにあります

 public static Dictionary<int, int> map = new Dictionary<int, int>() { { 0, 64 }, { 1, 1 }, { 2, 2 }, { 3, 4 }, { 4, 8 }, { 5, 16 }, { 6, 32 } };

//actually,this comes from the user interface, but we should focus on the database layer
WeekDays[] dw = new WeekDays[] {WeekDays.Saturday,WeekDays.Tuesday,WeekDays.Wednesday };
    
int[] systemDayOfWeekList = new int[daysOfWeek.Length];
    
for (int i = 0; i < daysOfWeek.Length; i++)
{
  systemDayOfWeekList[i] = map.FirstOrDefault(e => e.Value == (int)daysOfWeek[i]).Key;
}
    
query = query.Where(f => dayOfWeekList.Contains(((int)SqlFunctions.DatePart("dw", f.FromDateTime))));
于 2012-04-25T20:26:05.303 に答える