4

次のような [Flags] 列挙型があります。

[Flags]
public enum Status
{
  None = 0,
  Active = 1,
  Inactive = 2,
  Unknown = 4
}

Status 列挙には、次のような 2 つの値が含まれる場合があります。

Status s = Status.Active | Status.Unknown;

ここで、linq クエリ (LINQ to ADO.NET エンティティ) を作成し、ステータスが s 上記のレコード、つまりアクティブまたは不明のレコードを要求する必要があります。

var result = from r in db.Records
             select r
             where (r.Status & (byte)s) == r.Status

もちろん、LINQ to Entities は Where 句でプリミティブ型を処理することしか認識していないため、エラーが発生します。

エラーは次のとおりです。

タイプ 'Closure type' の定数値を作成できません。このコンテキストでは、プリミティブ型 (Int32、String、および Guid など) のみがサポートされます。

実行可能な方法はありますか?10 個の可能な値を持つステータス Enum があり、5 つのステータスをクエリする場合があります。Flags 列挙型を使用してエレガントな方法でクエリを作成するにはどうすればよいですか?

ありがとう。

アップデート

これは、Linq to Entities の問題のようです。LINQ to SQL で動作すると思います (わからない、テストしていません)。

4

7 に答える 7

8

使うだけHasFlag()

var result = from r in db.Records
         where r.Status.HasFlag(s)
         select r
于 2014-12-31T17:38:17.757 に答える
0

ビットごとの AND 演算が機能するかどうかはわかりませんが、s を int にキャストしてみてください。

        int i = (int)s;
        var result = from r in db.Records
             select r
             where (r.Status & i) == r.Status

どのデータベース エンジンを使用していますか? エンジンがビット演算をサポートしていない可能性があります。

参照: http://www.matthidinger.com/archive/2008/02/26/entity-framework-comparison-frustration-explained.aspx

于 2009-09-15T12:09:10.777 に答える
0

以下は、C#で私のために機能します

    public const StatusTypes ActiveAlert = StatusTypes.Accepted | StatusTypes.Delivered;

        int flags = (int)ActiveAlert;

        try
        {
            var query = from p in model.AlertsHistory
                        where (p.UserId == clientId
                        && (p.Status.HasValue && (p.Status.Value & flags) != 0))
                        select p;
            var aList = query.ToList();

            return (aList);


        }
        catch (Exception exc)
        {
            log.Error("Exception getting Alerts History for user.", exc);
            throw;
        }
于 2009-09-17T18:43:15.567 に答える
0

私はEFを知りませんが、追加のキャストを挿入することはできますか?

var result = from r in db.Records
             where ((byte)r.Status & (byte)s) == (byte)r.Status
             select r
于 2009-09-15T11:32:22.353 に答える
0

次のようにしてみてください。

byte status = (byte)(Status.Active | Status.Unknown);

var result = from r in db.Records
             select r
             where (r.Status & status) != 0
于 2009-09-15T11:35:06.827 に答える