У меня есть такое перечисление [Flags]:
[Flags]
public enum Status
{
None = 0,
Active = 1,
Inactive = 2,
Unknown = 4
}
Перечисление Status может содержать два значения, например:
Status s = Status.Active | Status.Unknown;
Теперь мне нужно создать запрос linq (LINQ to ADO.NET Entities) и запросить записи, статус которых указан выше, то есть Active или Unknown;
var result = from r in db.Records
select r
where (r.Status & (byte)s) == r.Status
Конечно, я получаю сообщение об ошибке, потому что LINQ to Entities знает, как обрабатывать примитивные типы только в предложении Where.
Ошибка:
Невозможно создать постоянное значение типа «Тип закрытия». В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).
Есть действенный способ? Я могу иметь статус Enum с 10 возможными значениями и запрашивать 5 статусов. Как элегантно построить запрос с использованием перечисления флагов?
Спасибо.
Обновить
Кажется, это проблема Linq to Entities. Я думаю, что в LINQ to SQL это работает (не уверен, не тестировал).
Active
иUnknown
. Это то, что вы хотите? - person LukeH   schedule 15.09.2009Status.Active|Status.Unknown
эквивалентно1|4
, то есть5
. Таким образом, ваше предложениеwhere
фактически говоритwhere (r.Status & 5) == r.Status
, что то же самое, что иwhere r.Status == 5
, что то же самое, что сказать (на английском языке), гдеr.Status
- это одновременноActive
иUnknown
! - person LukeH   schedule 15.09.2009HasFlag
поддерживается в LINQ-to-Entities. См. data.uservoice. ru / forum / и entityframework.codeplex.com/workitem/1497 - person Shay   schedule 17.02.2015