有其他方法可以进行此查询吗?(在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(); 
    }

有其他编程方法吗?

有其他方法可以进行此查询吗?(在linq-to-sql查询中包含一个拆分字符串)

当生命在数据库中为您提供字符串时,通常的响应是使用字符串解析:

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