有其他方法可以进行此查询吗?(在linq-to-sql查询中包含一个拆分字符串)
本文关键字:查询 linq-to-sql 包含一 字符串 拆分 方法 其他 | 更新日期: 2023-09-27 18:01:14
我有一个sql数据库,其中有一个包含一些产品的表,每个产品都可以在一台或多台机器上生产。现在我想搜索在某台机器上生产的所有产品。
表格是这样的:
productreference(nvarchar(|机器(nvarchal(
P1 | 1,2,3
P2 | 2
P3|2
P4|2,3
我尝试过使用以下查询,但我发现linq-to-sql不支持拆分字符串。
public List<string> GetReferenceForMach(string machName)
{
IEnumerable<string> producttmp = from product in productInfo
let machines = product.Machines.Split(',')
from machine in machines
where machine == machName
select product.Reference;
return producttmp.ToList();
}
有其他编程方法吗?
当生命在数据库中为您提供字符串时,通常的响应是使用字符串解析:
string machName;
string midName = ',' + machName + ',';
from product in productInfo
where (',' + product.Machines + ',').Contains(midName)
select product.Reference
没有索引可以帮助此查询,因此表扫描需要大括号。
Linq到SQL是好的,但它不是魔术!它仍然需要将查询减少到可执行的SQL(这就是为什么string.Split
这样的函数被禁止的原因——它们使生成等效的SQL变得困难(。在这种情况下,您所要求的内容是SQL server根本无法完成的(根据逗号分隔字段的内容进行搜索(。
如果您希望它像我认为的那样执行,那么您需要更改数据库模式,以便Machines
有自己的表,从而可以有效地进行索引和查询。
或者,您可以使用Linq-to-SQL获取整个表/结果集,然后使用好的旧Linq-to-Objects来完成艰苦的工作:
IEnumerable<string> producttmp = from product in productInfo.AsEnumerable()
let machines = product.Machines.Split(',')
from machine in machines
where machine == machName
select product.Reference;
(未测试(
尝试
return productInfo.AsEnumerable()
.Where(p => p.Machines.Split(',').Contains(machName))
.Select(p => p.Reference)
.ToList()
AsEnumerable((会关闭整个表,并将查询减少到linq到对象。显然,这种方法的缺点是,如果您的表很大,它可能会非常低效。
感谢大家帮助我,
它现在工作,我使用了以下代码:
IEnumerable<string> producttmp = from product in productInfo
let midName = "," + machName + ","
let checkMachines = "," + product.Machines + ","
where (checkMachines.IndexOf(midName) > -1)
select product.Reference;
return producttmp.ToList();