我有一个带有Flag枚举的对象,其中有几个可能的“用途”。标志枚举使用2的适当功率。
检查变量是否有某个标志,我可以使用.NET 4进行HasFlag()
BUT:
如果我将该标志组合存储为数据库中的int ...如何使用Entity Framework检索具有特定标志的对象?
例如,如果我的对象是“Contact
”类型,我想查询那些实际上是“客户和朋友”的对象,即ContactType
枚举中的客户和朋友标记
答案 0 :(得分:4)
db.Contacts.Where(c => (c.Flag & MyEnum.Flag3) != 0).ToList();
答案 1 :(得分:2)
我怀疑任何ORM都有办法让HasFlags适应你的DBMS的相应SQL代码。
您可能需要做的是编写存储过程,或者手动编写要为此执行的SQL语句。
你没有提到你正在使用的DBMS - 但如果我假设你正在使用SQL Server,那么你很幸运,因为它有& (Bitwise AND) operator。
T-SQL的实际例子:
-- Setup Test Data
DECLARE @Contacts TABLE (id int, contactType int, name nvarchar(MAX))
INSERT INTO @Contacts VALUES (1, 0, 'Fred'); -- Not Wanted
INSERT INTO @Contacts VALUES (2, 3, 'Jim'); -- Wanted
INSERT INTO @Contacts VALUES (3, 36, 'Mary'); -- Not wanted
INSERT INTO @Contacts VALUEs (4, 78, 'Jo'); -- Wanted
-- Execute Query
SELECT *
FROM @Contacts
WHERE ContactType & 2 = 2
答案 2 :(得分:2)
您可以将组合的位值作为int获取并将该值存储在db中,因为此处的列是示例:
public enum MessagingProperties
{
// No options selected (value is 0)
None = 0x00,
// messages are not discarded if subscriber is slow (value is 1)
Durable = 0x01,
// messages are saved to disk in case messaging crashes (value is 2)
Persistent = 0x02,
// messages are buffered at send/receive point so not blocking (value is 4)
Buffered = 0x04
}
为了组合这些标志枚举,您可以:
// combine the bit flags
var combinedFlags = MessagingProperties.Durable | MessagingProperties.Persistent |
MessagingProperties.Buffered;
// this will be equal 7, no other combination can sum up to seven so it is unique, that's how bit flags work
int combinedFlagsInt = (int)combinedFlags;
您现在可以继续将此值存储在数据库中。如果要查询多位标志,请执行以下操作:
Where
子句中的过滤器。