首页 > 解决方案 > 从表中过滤具有逗号和管道分隔值的列

问题描述

我有一个表名 TblDiscount,其中一列(产品)有一个逗号和管道分隔的值,如

"Product1|1,Product2|1,Product3|1",
"Product2|1,Product4|1,Product5|2", 

等所以记录存储如下:

Id      |       Product
1       |  Product1|1,Product2|1,Product3|1
2       |  Product2|1,Product4|1,Product5|2
3       |  Product6|1,Product7|1,Product8|2

我想在此列(产品)上应用过滤器。因此,如果我搜索“product5”,那么它应该返回 ID=2 的第二行。当我使用内存列表时,它工作正常

  List<string> products = new List<string> { "22235|1,22232|1,22246|1", 
    "22246|1,22245|1,22247|1" };
    var result = products.Where(x => x.Split(',').Any(c => c.Split('|').Any(y 
    => y.Equals("22247")))).FirstOrDefault();

但是当我用 sql 数据库表运行它时,它给了我错误:实际代码如下:

var isExist = this.DataContext.ProductTbl.Where(x => x.IsActive && 
x.product.Split(',').Any(c => c.Split('|').Any(y => y.Contains(productCode)))).Any()

它给我的错误是:
“ System.Data.Linq.dll 中发生'System.ArgumentException' 类型的异常,但未在用户代码中处理

附加信息:参数“值”是错误的类型。应为“System.String”。实际的'System.String[]'。“ 请帮忙!!!

标签: c#.netlinq

解决方案


如果您想使用 LINQ 过滤掉实体,则必须转换ProductTbl为例如。列表。尝试:

var isExist = this.DataContext.ProductTbl.ToList().Where(x => x.IsActive && 
x.product.Split(',').Any(c => c.Split('|').Any(y => y.Contains(productCode)))).Any();

但是,如果您只需要获取包含某些产品的行,您可以尝试:

var isExist = this.DataContext.ProductTbl.Any(x=> x.IsActive  && ("," + x.product).Contains(productCode + "|"));

推荐阅读