0

我有以下枚举:

[Flags]
public enum PostAssociations
{
    None = 0x0,
    User = 0x1,
    Comments = 0x2,
    CommentsUser = 0x3
}

作为开始,我不确定这些标志是否正确。

我这样做是为了让我有一种流畅的方式来定义实体框架的“包含”(因为 EF Include 方法需要一个字符串,我不想将它暴露给 UI)。

所以我想要它,以便我的服务层可以接受PostAssociations,并且在我的服务层中,我利用扩展方法将其转换为字符串 []。(我的回购然后为了做.Include而分裂)。

我对 Flags Enum's 做的不多,所以我为我的无知道歉。:)

这是我想要的“真值表”(枚举值,转换后的字符串 [])

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" }

不能有没有评论的评论用户。

所以我需要三件事的帮助:

  1. 如何设置枚举以匹配该真值表?
  2. 我如何为这些示例之一调用服务层?
  3. 如何编写扩展方法将该枚举转换为字符串数组?

当然,如果你们能想出一个更好的方法来做我想做的事情,我也会考虑的。本质上,我试图掩盖 Enum 后面的 EF Include 的“魔术字符串”,并且考虑到您可以执行多个包含(或不包含),我认为这对于 Flags Enum 来说是一个很好的例子。

多谢你们。

4

2 回答 2

2

如果您使用标志创建了枚举:

[Flags]
public enum PostAssociations
{    
    None = 0x0,
    User = 0x1,
    Comments = 0x2,
    CommentsUser = User|Comments,
}

那会更有意义。在您当前的代码中,我不明白您要实现的目标。

否则,我认为您根本不想要基于标志的枚举...

于 2010-10-06T00:25:57.570 回答
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);
于 2010-10-06T00:34:35.380 回答