【问题标题】:C# Linq Where and RegexC# Linq Where 和正则表达式
【发布时间】:2019-09-18 21:38:55
【问题描述】:

我的数据库中有 4 行(示例),我将数据从数据库加载到 DataModel,例如 Code 和 Serie 列的 Regex:

Id;Code;Serie
1;XXX;XXX
2;XXX;XXX_A
3;WWW;YYY_A|YYY_B
4;CCC;XXX_A

当我在下面使用输入参数 Code = XXXSerie = XXX_A 的 LINQ 查询时,我得到了 2 个结果,但正确的结果只有一行 ID == 2

model = _seriesData.Where(s => (s.Code.IsMatch(code) && s.Type.IsMatch(serie)));

我不知道问题出在哪里,但是 LINQ 只能使用一个参数

在我的模型专栏 Code 和 Serie 是 Regex 类型

更新

对于代码行正则表达式,我也使用像这样的正则表达式 XXX_A|XXX_B|YYY_A _seriesData 变量中的数据是可以的,但是结果是错误的

数据模型

public class SerieModel
{
    public Regex Type { get; set; } // name of serie
    public Regex Code { get; set; }
}

有人帮我吗?

【问题讨论】:

  • 请记住,.Where 子句中的几乎所有函数调用都会导致从数据库中检索数据并且该子句将在本地运行。这可能涉及通过您的网络发送大量记录并且效率非常低。
  • 看起来很奇怪!如果您使用 .equals 或 '==' 进行测试,您会得到什么?
  • 试试这个:model = _seriesData.Where(s => (s.Code==code && s.Serie==serie)).FirstOrDefault();
  • 使用 FirstOrDefault();不是解决方案,因为我不知道我要查找的行是否在 DB 中是第一个,== 也不能用于 Regex 数据类型,Type 和 Serie 是相同的,只有另一个名称
  • 当字符串类方法无法使用时,您应该使用正则表达式。正则表达式的效率远低于字符串类。您只需要一个简单的比较:model = _seriesData.Where(s => (s.Code == code) && (s.Type == serie));

标签: c# regex linq


【解决方案1】:

这可能是因为您的正则表达式匹配子字符串,而不是整个字符串。通过将您的模式包装在 ^...$ 符号中来匹配整个字符串:

new Regex("XXX").IsMatch("XXX");     //true
new Regex("XXX").IsMatch("XXX_A");   //true <- heh, didn't expect that?
new Regex("^XXX$").IsMatch("XXX");   //true
new Regex("^XXX$").IsMatch("XXX_A"); //false <- this is what you want

因此,要么将列中的数据更改为:

Id;Code;Serie
1;^XXX$;^XXX$
2;^XXX$;^XXX_A$
3;^WWW$;^(YYY_A|YYY_B)$
4;^CCC$;^XXX_A$

或者在反序列化时将其更改为行:

public class SerieModel
{
    public Regex Type { get; set; } // <- put here wrapped regex.
    public Regex Code { get; set; } // <- put here wrapped regex.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多