使用Linq进行WildCard搜索

时间:2014-06-27 06:21:15

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

我正在使用值为

的Cardtable

Cardtable

  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(使用不带短划线的数字)

有人可以提供帮助吗?

3 个答案:

答案 0 :(得分:4)

在对其他答案的评论中,您已指出要在服务器端执行查询。您可以通过将卡号转换为具有数据库中使用的格式的规范卡号来执行此操作:

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);

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

答案 1 :(得分:2)

你可以通过比较Enumerable.Where中的条件陈述来做到这一点。替换CardNumber和变量中的hypen将使两个字符串不带连字符,并且它将解决带有和不带连字符数的两种情况。

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

答案 2 :(得分:1)

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);
        }