【问题标题】:select base on enum parameter without swich case?基于枚举参数选择没有开关盒?
【发布时间】:2018-06-05 08:07:07
【问题描述】:

考虑我们有这个表,你可以看到有一个字符串字段我们保持文章的状态

ArticleState 可以是 New、Draft 或 Published

USE [test]
GO

CREATE TABLE [dbo].[Article](
    [id] [int] NOT NULL PRIMARY KEY CLUSTERED,
    [ArticleState] [nvarchar](100) NOT NULL,
    [Title] [nvarchar](255) NOT NULL,
    [Content] [nvarchar](max) NOT NULL
)

GO

INSERT INTO Article VALUES (1,'New','title1','this is a test');
INSERT INTO Article VALUES (2,'Draft','title2','this is a test');
INSERT INTO Article VALUES (3,'New','title3','this is a test');
INSERT INTO Article VALUES (4,'Published','title4','this is a test');
GO

我们有这个枚举

public enum ArticleStateEnum
    {
        [EnumDescription("Draft Articles")]
        Draft = 10,

        [EnumDescription("New Articles")]
        New = 20,

        [EnumDescription("Published Articles ")]
        Published = 30,
    }

我们如何根据 ArticleState 选择文章? 我的意思是我可以写什么而不是???????????????????????????????

    // GET: Articles
    public ActionResult Index()
    {
      var result=  GetArticlesByState(ArticleStateEnum.Draft);
        return View(result);
    }
    public void GetArticlesByState(ArticleStateEnum nse)
    {

        var articleList = db.Articles.Where(x => x.ArticleState ==  ??????????????????????????????);
    }

【问题讨论】:

  • 为什么你没有将枚举作为 int 保存在数据库中?您可以只保存 10、20 或 30,然后使用 var articleList = db.Articles.Where(x => x.ArticleState == ArticleStateEnum.New);
  • 顺便说一句,将状态作为INT 存储在数据库中更有意义,因为这就是枚举值。顺便说一句,如果您要将它们存储为字符串,则根据您的值,您应该使用 VARCHAR 而不是 NVARCHAR 因为没有 unicode 值 - 您只需占用两倍的字节数通过将它们存储为 unicode..
  • @Martin 别人设计的数据库,我要根据已有的数据库和项目编写代码

标签: c# asp.net-mvc linq enums


【解决方案1】:

假设您无法更改数据库表示,您可以使用ToString 调用获取字符串值:

public void GetArticlesByState(ArticleStateEnum nse)
{
    string stateText = nse.ToString();
    var articleList = db.Articles.Where(x => x.ArticleState == stateText);
    ...
}

【讨论】:

    【解决方案2】:

    我会使用Enum.GetName(typeof(ArticleStateEnum), nse)

    要么喜欢:

    public void GetArticlesByState(ArticleStateEnum nse)
    {
        var articleList = db.Articles
             .Where(x => x.ArticleState == Enum.GetName(typeof(ArticleStateEnum), nse));
    }
    

    或喜欢:

    public void GetArticlesByState(ArticleStateEnum nse)
    {
        string state = Enum.GetName(typeof(ArticleStateEnum), nse);
        var articleList = db.Articles.Where(x => x.ArticleState == state);
    }
    

    请注意,即使使用 int 值,此解决方案也适用(只要该值与枚举值匹配):

    public void GetArticlesByState(int nse)
    {
        string state = Enum.GetName(typeof(ArticleStateEnum), nse);
        var articleList = db.Articles.Where(x => x.ArticleState == state);
    }
    

    【讨论】:

    • 您有什么理由热衷于Enum.GetName 而不仅仅是打电话给ToString? (在 int 版本中,只需转换为 ArticleStateEnum 并调用 ToString 即可。)请注意,我怀疑第一种形式 不会 工作,因为我不希望 LINQ 提供程序能够识别Enum.GetName
    • 之所以主要是因为int版本,而且我相信这就是这个函数的用途。我怀疑第一个表格也是如此,这就是我添加第二个表格的原因。我对ToString 无话可说,这只是一种选择。此外,Enum.GetName 不会像强制转换那样抛出异常,如果值不匹配,它只会返回 null
    • 不,强制转换也不会抛出异常。 ToString() 将返回数值。
    • 好吧,我想会的。谢谢你告诉我:)
    • @DaisyShipton 显然,this answer 似乎说Enum.GetNameToString 快,因为ToString 内部调用Enum.GetName。而that answer 使用nameof(MyEnum.EnumValue)
    猜你喜欢
    • 2022-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多