你能帮我解决下一个问题:我想在一个查询中添加SqlMethods.Like()的变量数吗?
例如:我在列表catCode中有四个单词,如何用四个SqlMethods.Like()创建LINQ查询?
using (var db = new MappingDataContext(_connection))
{
db.ObjectTrackingEnabled = false;
return (
from r in db.U_CDW_REPORTs
where (catCode.Length > 0 ?
SqlMethods.Like(r.CATEGORY, catCode) : r.CATEGORY != "*")
where r.SI_QTY > 0
orderby r.SI_QTY descending
select new Item
{
...
}).ToList();
}
答案 0 :(得分:2)
您需要的是动态删除SqlMethod.Like
操作。您需要PredicateBuilder。
<小时/> 更新:以下是如何使用谓词构建器的示例。
string[] searchItems =
new string[] { "Pattern1", "Pattern2", "Pattern3" };
var likeExpression = PredicateBuilder.False<U_CDW_REPORT>();
foreach (string searchItem in searchItems)
{
var searchPattern = "%" + searchItem + "%";
likeExpression = likeExpression.Or(r =>
SqlMethods.Like(r.CATEGORY, searchPattern));
}
return (
from r in db.U_CDW_REPORTs.Where(likeExpression)
where r.SI_QTY > 0
orderby r.SI_QTY descending
select new Item { ... }).ToList();
答案 1 :(得分:1)
你的意思是你有4个不相交的LIKE
条款?
from entityRow in ctx.MyEntity
where (SqlMethods.Like(entityRow.Col, "%Pattern1%")
|| SqlMethods.Like(entityRow.Col, "%Patte%rn2%")
|| SqlMethods.Like(entityRow.Col, "Pattern3%")
|| SqlMethods.Like(entityRow.Col, "%Patte%rn4%"))
select entityRow;
<强>更新强>
在这种情况下,请看一下:LINQ for LIKE queries of array elements
答案 2 :(得分:1)
编辑:使代码更简单。另请注意下面的更新说明。
您可以通过以下方式使用多个Where
子句构建查询。请注意,此方法会对Where
子句进行AND,这意味着所有搜索项都需要存在。换句话说,它类似于... where (condition1) && (condition2) && (conditionN)
。
string[] words = { "A", "B", "C" };
var query = dc.Products.AsQueryable(); // gives us an IQueryable<T> to build upon
foreach (var s in words)
{
query = query.Where(p => SqlMethods.Like(p.ProductName, "%" + s + "%"));
}
foreach (var item in query)
{
Console.WriteLine(item.ProductName);
}
我们的想法是设置查询的第一部分,然后循环搜索术语并更新查询。当然你应该根据需要更新你的模式;我使用%word%
仅用于说明目的。