【问题标题】:WildCard Search Using Linq使用 Linq 进行通配符搜索
【发布时间】:2014-06-27 06:21:14
【问题描述】:

我有一个带有值的卡片表

卡片桌

  ID       Card No
-------   ----------
  1     | 0001-1234-5678-9001
  2     | 0001-1234-5678-9002
  3     | 0001-1234-5678-9003
  4     | 0001-1234-5678-9004
  5     | 0001-1234-5678-9005

现在我想使用LINQCard No 在此表中搜索

i.e. 0001-1234-5678-9001(直接使用数字)或0001123456789001(使用不带破折号的数字)

有人可以帮忙吗?

【问题讨论】:

    标签: c# linq asp.net-mvc-4 c#-4.0


    【解决方案1】:

    在其他答案的 cmets 中,您已表示要在服务器端执行查询。您可以通过将卡号转换为具有数据库中使用的格式的规范卡号来做到这一点:

    String GetCanonicalCardNo(String cardNo) {
      if (cardNo.Length == 19)
        return cardNo;
      if (cardNo.Length != 16)
        throw new ArgumentException("Invalid card number.", "cardNo");
      return String.Format(
        "{0}-{1}-{2}-{3}",
        cardNo.Substring(0, 4),
        cardNo.Substring(4, 4),
        cardNo.Substring(8, 4),
        cardNo.Substring(12, 4)
      );
    }
    

    此函数会将卡号转换为0001-1234-5678-9001

    然后您可以使用如下代码找到一张卡片:

    var canonicalCardNo = GetCanonicalCardNo(cardNo);
    var card = Cards.FirstOrDefault(card => card.CardNo == canonicalCardNo);
    

    用于选择卡片的谓词只包含一个字符串比较,可以在服务器端执行。

    【讨论】:

    • 谢谢马丁,我也在找同样的东西,你回答说,非常感谢你,节省了我很多时间 :) :) :)
    【解决方案2】:

    您可以通过比较Enumerable.Where 中的条件语句来做到这一点。替换 CardNumber 和变量中的连字符将使两个字符串都没有连字符,它将解决有和没有连字符数字的两种情况。

    var result = Cardtable
                .Where(c=> c.CardNumber.Replace("-", "") == cardVariable.Replace("-", ""));
    

    【讨论】:

    • 感谢 Adil 的回答,但它给了我错误,LINQ to Entities 无法识别方法 'System.String Replace(Char, Char)' 方法,并且此方法无法翻译成商店表达。
    • 请检查我更新的答案,我使用了其他重载的替换。
    【解决方案3】:

    http://ideone.com/AyfBMm

            List<Cardtable> cardtable = new List<Cardtable>();
    
            cardtable.Add(new Cardtable() { id = 1, cardno = "0001-1234-5678-9001" });
            cardtable.Add(new Cardtable() { id = 2, cardno = "0001-1234-5678-9002" });
    
            string search_string = "0001-1234-5678-9002";
            var result = from c in cardtable
                    where c.cardno.Replace("-", "") == search_string.Replace("-", "")
                    select c;
    
            foreach (Cardtable ct in result)
            {
                Console.WriteLine("{0}:{1}", ct.id, ct.cardno);
            }
    

    【讨论】:

    • 非常感谢 DayDayHappy 的回答,但它给了我在上述问题中评论的相同错误,LINQ to Entities 无法识别方法“System.String Replace(Char, Char)”方法,并且此方法无法翻译成商店表达式
    • 您是否输入了“使用 System.Linq;” ?
    • 不要使用“.NET Framework 4 Client Profile”,我记得很久以前就体验过。
    • 这个答案等同于@Adil 的答案。
    • @CSharpie 他的原始答案与第一个版本不同。
    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 2010-11-05
    • 2011-03-23
    • 2019-03-08
    • 2023-03-05
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多