【问题标题】:LINQ Query using 'StartsWith' with an array使用带有数组的“StartsWith”的 LINQ 查询
【发布时间】:2014-02-13 09:33:22
【问题描述】:

在我的 LINQ 查询中,我使用 Where 子句来检查属性是否存在于值数组中。我想更新查询:

string[] itemColour
string[] itemType

List<displayItem> displayItems = (from item in allItems
                                  Where itemColour.Contains(item.colour)
                                  Where itemType.Contains(item.type)
                                  select new displayItem
                                  ......................etc...etc

所以我拥有的是

'我的 'itemColour' 数组包含这个 'item.colour' 选择它'

'我的'itemType'数组包含这个'item.type'的地方选择它'

我追求的是

'如果我的 'itemColour' 数组有一个项目,其中任何地方都有 'item.colour',请选择它
'如果我的 'itemType' 数组有一个以 'item.type' 开头的项目,请选择它

我知道“StartsWith”和“EndsWith”,但不知道如何将它们与这些数组一起使用。

注意: itemColour 可能包含颜色代码为“RGW”的项目,我希望能够根据三个字母中的任何一个来选择该项目

更新

建议的解决方案:

var query = from item in allItems
        where itemColour.Any(c => c.Contains(item.colour))
           && itemType.Any(t => t.StartsWith(item.type)
        select ...;

有问题。如果我想带回颜色代码为“RB”的商品。 我的数组可能包含两个项目“R”和“B”,建议的查询只返回颜色代码为“R”或“B”的项目,而不是两者。

我正在使用 MVC 5、LINQ TO Entity、.NET 4.5

谢谢

【问题讨论】:

    标签: c# arrays linq


    【解决方案1】:

    我怀疑您正在寻找Any,它允许您检查序列中的任何项目(本例中为数组)是否与谓词匹配:

    var query = from item in allItems
                where itemColour.Any(c => c.Contains(item.colour))
                   && itemType.Any(t => t.StartsWith(item.type)
                select ...;
    

    根据您有多少颜色条目和确切的语义,可能会有一些优化。

    如果您想查找匹配任何一种颜色类型的项目,请改用||

    var query = from item in allItems
                where itemColour.Any(c => c.Contains(item.colour))
                   || itemType.Any(t => t.StartsWith(item.type)
                select ...;
    

    编辑:您的描述不清楚,但完全有可能您真的想要:

     itemColour.Any(c => item.colour.Contains(c))
    

    相反。合理地思考您要检查的内容,并适当地应用它。

    【讨论】:

    • 谢谢 任何是我需要的。但这个查询没有产生我预期的结果。我会编辑我的问题
    • @user2390419:没有更多信息,我们帮不了你。您是否想要|| 而不是&amp;&amp;? (换句话说,您是否试图找到符合 either 要求而不是 both 的项目?)
    • 您好,感谢您的帮助我已经更新了我的问题,我的问题是 contains 似乎与 'like' 的工作方式不同
    • @user2390419:是的,但我怀疑根据您的原始描述,我们已经向后使用它,这表明 itemColour 数组有值“RGW”,该项目将具有“R”、“G”或“W”。我怀疑你实际上是相反的意思。如果您提供示例数据或理想情况下是一个简短但完整的程序,会更容易为您提供帮助。
    • 啊,你是对的,我在我的问题中写错了,我刚刚测试过,这是有效的,谢谢
    【解决方案2】:

    类似:

    from item in allItems
    where itemColour.Any(x => x.Contains(item.colour))
    where itemType.Any(x => x.StartsWith(item.type))
    select new displayItem
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2014-06-20
      • 1970-01-01
      相关资源
      最近更新 更多