gpt4 book ai didi

c# - 在 Linq 语句中使用 "Match"

转载 作者:太空狗 更新时间:2023-10-29 22:05:55 25 4
gpt4 key购买 nike

我有一个包含两条记录的表(在运行时会有很多)。记录的 deviceId 是“DEVICE1”和“DEVICE2”。我想使用正则表达式来提取记录。

下面的代码可以编译但无法返回结果。当我将光标悬停在“devices.ToList()”语句上时,出现以下错误:

base {System.SystemException} = {"LINQ to Entities 无法识别 'System.Text.RegularExpressions.MatchCollection Matches(System.String)' 方法,并且此方法无法转换为存储表达式”}”

谁能告诉我如何修改我的查询,以便根据表达式返回记录?

filterText = @"DEVICE.";
Regex searchTerm = new Regex(filterText);

using (var ctx = new MyEntities())
{
var devices = from d in ctx.Devices
let matches = searchTerm.Matches(d.DeviceId)
where matches.Count > 0
select ((Device)d);
return devices.ToList();
}

最佳答案

我认为您不能将正则表达式与 LINQ to Entities 结合使用。但是,看起来您只是想查找以“DEVICE”开头的设备,因此查询将是:

return ctx.Devices.Where(d => d.DeviceId.StartsWith("DEVICE"))
.ToList();

编辑:如果您确实需要正则表达式的灵 active ,您可能应该首先将设备 ID(并且设备 ID)取回客户端,然后对这些执行正则表达式,最后获取与这些查询匹配的其余数据:

Regex regex = new Regex(...);

var deviceIds = ctx.Devices.Select(d => DeviceId).AsEnumerable();

var matchingIds = deviceIds.Where(id => regex.IsMatch(id))
.ToList();

var devices = ctx.Devices.Where(d => matchingIds.Contains(d.DeviceId));

这是假设一开始为所有设备获取所有数据实际上会很昂贵。如果这不是太糟糕,那将是一个更简单的选择。要强制在进程中执行处理,请使用 AsEnumerable():

var devices = ctx.Devices.AsEnumerable()
.Where(d => regex.IsMatch(d.DeviceId))
.ToList();

关于c# - 在 Linq 语句中使用 "Match",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3493501/

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