我有以下枚举:
[Flags]
public enum PostAssociations
{
None = 0x0,
User = 0x1,
Comments = 0x2,
CommentsUser = 0x3
}
作为开始注释,我不确定这些标志是否正确。
我这样做是为了让我有一种流畅的方式为Entity Framework定义“包含”(因为EF Include方法需要一个字符串,我不想暴露给UI)。
所以我想要它,所以我的服务层可以接受 PostAssociations ,在我的服务层我使用扩展方法将其转换为字符串[]。 (我的回购然后拆分以便进行.Include)。
我对Flags Enum没有做太多,所以我为我的无知道歉。 :)
这是我想要的“真值表”(枚举值,变换后的字符串[])
None = null
User = new string[] { "User" }
Comments = new string[] { "Comments" }
User, Comments = new string[] { "User", "Comments" }
Comments, CommentsUser = new string[] { "Comments", "Comments.User" }
User, Comments, CommentsUser = new string[] { "User", "Comments", "Comments.User" }
没有评论就没有评论用户。
所以我需要三件事的帮助:
当然,如果你们想到一个更好的方式来做我想做的事情,我也会考虑到这一点。基本上我正试图掩盖EF Enlude在Enum后面的“魔法字符串”,考虑到你可以做多个包含(或者没有),我认为这是一个标志枚举的好例子。
谢谢你们。
答案 0 :(得分:3)
如果您使用flags创建枚举:
[Flags]
public enum PostAssociations
{
None = 0x0,
User = 0x1,
Comments = 0x2,
CommentsUser = User|Comments,
}
这会更有意义。在您当前的代码中,我不明白您要实现的目标。
否则,我认为你根本不想要基于标志的枚举......
答案 1 :(得分:0)
我的坏人,我对标志枚举的经验不足导致了一个令人困惑的问题。
我的方案对于标志枚举无效。
相反,我选择使用PostAssociations []。
我的服务层:
public Post FindSingle(int postId, PostAssociations[] postAssociations)
{
return repo.Find(postAssocations.ToEfInclude()).WithId(postId);
}
扩展方法:
public static string[] ToEfInclude(this PostAssociations[] postAssocations)
{
if (postAssocations == null) return null;
List<string> includeAssociations = new List<string>();
if (postAssocations.Contains(PostAssociations.User))
includeAssociations.Add("User");
if (postAssocations.Contains(PostAssociations.Comments))
{
if (postAssocations.Contains(PostAssociations.CommentsUser))
{
includeAssociations.Add("Comments.User");
}
includeAssociations.Add("Comments");
}
return includeAssociations.ToArray();
}
用法:
PostAssociations[] associations = new[] { PostAssociations.Comments, PostAssociations.User, PostAssociations.CommentsUser };
return service.Find(1, associations);