【问题标题】:How to use multi-valued/array parameter(enum values) obtained from Request.Query in LINQ queries?如何在 LINQ 查询中使用从 Request.Query 获得的多值/数组参数(枚举值)?
【发布时间】:2019-11-27 18:06:25
【问题描述】:

我对现代风格的 .NET 开发和实体框架还是很陌生。我正在尝试获取其中一个值落在其他值列表中的对象列表,并且我正在尝试使用 LINQ 查询方法来执行此操作。

string cb_orderstatus = Request.Query["OrderStatusSearch"].ToString();
if (!string.IsNullOrEmpty(cb_orderstatus))
{
    string[] orderStatuses = cb_orderstatus.Split(",");
    query = query.Where(o => orderStatuses.Contains(o.Status.ToString()));
}

如果 cb_orderstatus 的值是一个包含 5、10 和 15 的字符串数组,我希望查询返回其 Status 等于其中任何值的对象。目前它不工作。有人可以帮忙吗?

【问题讨论】:

  • o.Status是什么类型?
  • 什么是query
  • 另外,不工作是什么意思?会抛出异常吗,什么样的异常或者返回什么样的结果?
  • 您的代码在逻辑上似乎是正确的。我有根据的猜测是o.Status.ToString() 的结果不是您所期望的,或者如果是,则字符串比较存在问题。
  • 如果Request.Query["OrderStatusSearch"] 是一个数组,那么ToString 的结果将不会是一个逗号分隔的值列表。它将是数组的类型,例如 "System.Int32[]" 用于 int[]

标签: c# asp.net entity-framework linq


【解决方案1】:

这是一个有根据的猜测,但正如你所说的那样

o.Status 是一个 OrderStatus 枚举

那么很可能您需要将值从cb_orderstatus 转换为实际的OrderStatuses 值并在查询中使用OrderStatus[].Contains

string cb_orderstatus = Request.Query["OrderStatusSearch"].ToString();
if (!string.IsNullOrEmpty(cb_orderstatus))
{
    var orderStatuses = cb_orderstatus
        .Split(",")
        .Select(statusIntegerString => 
            (OrderStatus)int.Parse(statusIntegerString))
        .ToArray();
    query = query.Where(o => orderStatuses.Contains(o.Status));
}

虽然我不确定您是否会从Request.Query["OrderStatusSearch"] 获得逗号分隔值。

无论如何,依靠标准参数binding 会好几个数量级,所以我建议您发布另一个处理

的问题

我在模型类上有一个属性,它上面有 [BindProperty] 并且是 List 类型,但它没有填充任何数据。

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2015-02-12
    • 2010-12-05
    • 1970-01-01
    • 2016-09-10
    • 2023-02-03
    • 2022-01-15
    • 2021-01-17
    相关资源
    最近更新 更多