【问题标题】:Linq to work with slightly complex selectlistLinq 使用稍微复杂的选择列表
【发布时间】:2013-05-01 05:37:23
【问题描述】:

这是一个简化的选择列表

<select name="stuff">
    <option value="">All</option>
    <option>Test</option>
    <option>Test1</option>
    <option>Test2</option>
    <option>Horses</option>
</select>

根据选择列表中的值,我希望从我的表中找到相关值。

LINQ

1. someTable.Where(r => r.someField.Contains(stuff));
2. someTable.Where(r => r.someField == stuff);

3. var a = someTable;
if(stuff != null)
a = a.Where(r => r.someField.Contains(stuff))

选择“全部”选项时,前一种解决方案将正常工作。由于 All 由空字符串 stuff 表示,.Contains 在任何情况下都将返回 true。这会在选择 Test 时中断,因为它还会返回 Test1Test2

第二种解决方案 (==) 将适用于除 All 之外的所有情况,如果我想将它用于多选列表,它会中断。

第三种解决方案将正确处理 All,但如果 Test 为已选中。

如何修改此代码以使用 All、多选和仅选择精确值?

【问题讨论】:

  • 第三个解决方案为什么不使用r.someField == stuff?如果 .Contains 给出不正确的行为,你为什么还要使用它,这令人困惑。
  • @mellamokb 在第三个解决方案中使用== 仅在没有多选的情况下才有效。我结束了第二个解决方案,并介绍了多选将如何中断。我应该让它更明确一点

标签: c# asp.net-mvc linq


【解决方案1】:

无论哪种方式,您都需要添加一个特殊情况来覆盖"All",因为它很特别。例如,您可以像这样重写您的第二个解决方案:

someTable.Where(r => string.Empty == stuff || r.someField == stuff);

【讨论】:

  • @mellamokb 啊,你是对的,我错过了 All 是显示名称,而它的值是 string.Empty。非常感谢!
  • 如此明显的解决方案!我什至不能把我的疏忽归咎于星期一!那些星期二该死的。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多