gpt4 book ai didi

c# - 编写 Regex 模式以查找没有 Select 方法的 IQueryable 链接方法

转载 作者:行者123 更新时间:2023-11-30 20:18:12 24 4
gpt4 key购买 nike

在网络应用程序中,我是开发团队的一员,我们使用 Entity Framework 作为 ORM。当我们执行 SQL 查询时,我们通常链接 Entity Framework 提供的 IQueryable 方法,从方法 Items() 开始,这是我们项目特定的 DbSet 模型投影。我一直在尝试编写一个 Regex 模式来查找不使用 Select 方法的查询。

这是我们的代码通常看起来的样子

Cars.Items()
.Where(x => x.Year == "1988")
.Select(x => new { x.Registration })
.ToList();

Cars.Items()
.Where(x => x.Id == 1923984)
.Select(x => new { x.Registration })
.FirstOrDefault;

这是我想要查找的查询类型

Cars.Items()
.Where(x => x.Id == 1923984)
.FirstOrDefault;

我尝试使用否定前瞻来排除具有 Select() 方法的查询,但它们被包括在内,我正在努力想出一种替代方法。

\.Items\(.*\)(\s*\..*\(.*\))*(?!\.Select\(.+\))(\s*\..*\(.*\))\;

我会分解我的逻辑

  • \.Items\(.*\) 所有查询都以此方法开头
  • (\s*\..*\(.*\))* 任意数量的链接 IQueryable 方法
  • (?!\.Select\(.+\)) 应排除 Select() 方法
  • (\s*\..*\(.*\))\ 这可能是一个First(), FirstOrDefault(), Single() 或类似的
  • ; 结束查询

最佳答案

我也尝试过为此创建一个正则表达式。您可以在这里进行测试:https://regex101.com/r/qRU2sP/5

正则表达式:Cars(?>\.(?!select)\w+(?:\([^)]*\))?\s*)+\;

与 vendettamit 给出的答案的细微差别在于,这个答案涵盖了整个陈述。

编辑:那么它是如何工作的?

我 try catch 重复部分(.Items().Select()),以便更容易维护/遵循该模式。

汽车
我将 Cars 放在开头,因为这样正则表达式引擎会尽快知道下一组字符是否有趣。这减少了所需的步骤量。也可以用 \w+ 替换,但随后会执行更多步骤,因为整个文本中有更多字符与之匹配。

(?>
我在这里开始一个原子组。这意味着正则表达式引擎在遵循正则表达式模式时不会回溯。这大大提高了性能,因为如果模式的一部分失败,它不会尝试其他可能性。 More detail here.

\.
按字面匹配 . 字符。

(?!select)
否定前瞻 - 仅在未选择 select 时才匹配。我在 regex101.com 上使用了不区分大小写的修饰符,但 C# 也支持这一点。否则只需将其更改为 [Ss]elect

\w+
匹配任何单词字符 a-zA-Z0-9_ 至少一次。这与文本的 whereselect 部分匹配。

(?:
我在这里开始一个新的非捕获组。我这样做是因为模式的下一部分是可选的(方法/lambda 的 () 部分)。

\(
这只是匹配 ( 字面意思。

[^)]*
这匹配所有内容(包括任何内容。请参阅 *)直到遇到 ) 字符。

\)
字面上匹配 ) 字符。

)?
我关闭可选(请参阅 ?)组。请记住,这是每个方法/lambda 的 () 的一部分,但它也可能是一个属性,因此 () 部分必须是可选的。

\s*
尽可能多次匹配任何空白字符(如空格、制表符和换行符)。

)+
在这里,我们结束与文本的 .Where(x => x) 部分匹配的组(至少一次。参见 +)。

\;
按字面匹配 ; 字符。

就是这样!所以对性能影响最大的是 Cars 部分和 (?> 原子组。

关于c# - 编写 Regex 模式以查找没有 Select 方法的 IQueryable 链接方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41938832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com