我的解决方案有两个部分。我为 Enum 标志制作了一个序列化程序,它将所有值存储在字符串列表中。我为 Linq 做了一个扩展方法来“注入”我需要的 mongo 查询。
public static IQueryable<TItem> HasFlags<TItem, TProperty>(
this IQueryable<TItem> items,
Expression<Func<TItem, TProperty>> itemPropertyExpression,
params Enum[] enumFlags)
{
var enumFlagNames = enumFlags.Select(enumFlag => (BsonValue)enumFlag.ToString());
return items.Where(item => Query.In(ExtendedObject.GetPropertyName(itemPropertyExpression), enumFlagNames).Inject());
}
这样,它既可读又我不需要将所有对象反序列化到内存中。
PS:GetPropertyName 方法只是获取属性名称的一种类型安全的方法:
public static string GetPropertyName<TClass, TProperty>(
Expression<Func<TClass, TProperty>> entityPropertyExpression)
{
return ((MemberExpression)entityPropertyExpression.Body).Member.Name;
}