C# 实体,包含或相交,是否可以进行此查询?
我有一个以这种方式检索的字符串列表:C# 实体,包含或相交,是否可以进行此查询?,c#,entity-framework,C#,Entity Framework,我有一个以这种方式检索的字符串列表: List<string> keyWords = db.MotCleRecherche.Select(t => t.MotClé).ToList(); 或 我想你可以看到它即将到来。。。我不知道如何才能真正做到这一点。。。我所知道的只是考虑一份X文件和Y文件: X.Intersect(Y).Any() 如果存在相等的值,则返回true。。。但是DESC_ART只是一个很长的字符串,我想知道我的一些关键字是否在其中我同意Stephen的观点
List<string> keyWords = db.MotCleRecherche.Select(t => t.MotClé).ToList();
或
我想你可以看到它即将到来。。。我不知道如何才能真正做到这一点。。。我所知道的只是考虑一份X文件和Y文件:
X.Intersect(Y).Any()
如果存在相等的值,则返回true。。。但是DESC_ART只是一个很长的字符串,我想知道我的一些关键字是否在其中我同意Stephen的观点,在比较之前,你应该先将关键字放低。但是如果你真的需要用linq做这件事,你可以这样做
var result = db.DAapp.Where(t => keywords.Any(keyword=> string.Equals(keyword,t.DESC_ART, StringComparison.InvariantCultureIgnoreCase )));
这将导致在linq循环的每次迭代中,对每个字符串调用一个lower,因此代价很高。首先将其添加到项目中(例如,添加到控制器中):
AnyOf的静态表达式(
参数表达式[]表达式)
{
if(expressions==null | | expressions.Length==0)返回x=>false;
if(expressions.Length==1)返回表达式[0];
var body=表达式[0]。body;
var param=表达式[0]。参数。Single();
for(int i=1;i
这是我从你那里找到的。现在,您可以创建所需的查询,如下所示:
var filters = new List<Expression<Func<Models.DAapp, bool>>>();
foreach (var st in keyWords)
filters.Add(d => d.DESC_ART.ToLower().Contains(st.ToLower()));
var lambda = AnyOf(filters.ToArray());
var q = db.DAapp.Where(t =>
t.CODE_ART.StartsWith(s)
&& t.DATE_CREAT >= debut
&& t.DATE_CREAT < fin
);
q = q.Where(lambda);
var res = q.ToList();
var过滤器=新列表();
foreach(关键字中的var st)
filters.Add(d=>d.DESC_ART.ToLower().Contains(st.ToLower());
var lambda=AnyOf(filters.ToArray());
var q=db.DAapp.Where(t=>
t、 代码\u艺术开始与(s)
&&t.DATE_CREAT>=首次亮相
&&t.DATE_创建
请注意,此解决方案仅创建一个包含多个where表达式的select查询。与以下在where子句中包含多个select查询的其他解决方案相比,哪一种更有效:
var q = db.DAapp.Where(t =>
t.CODE_ART.StartsWith(s)
&& t.DATE_CREAT >= debut
&& t.DATE_CREAT < fin
&& keyWords.Any(k => t.DESC_ART.ToLower().Contains(k.ToLower()))
);
var q=db.DAapp.Where(t=>
t、 代码\u艺术开始与(s)
&&t.DATE_CREAT>=首次亮相
&&t.DATE_创建t.DESC_ART.ToLower().Contains(k.ToLower()))
);
您可能只需执行以下操作:db.DAapp.Where(t=>keyWords.Contains(t.DESC\u ART.ToLower())
…并且您需要先ToLower()
您的整个关键字db.motclerecher.Select(t=>t.MotCle.ToLower()).ToList()
@stephen.vakil关键字列表从一开始就放低是件好事,谢谢,但这个关键字不可能包含描述艺术,描述艺术有500辆车长,我的大多数关键字都有5到6个字母…我明白了-你想搜索任何包含任何指定关键字的描述艺术
吗?比如t=>关键词.Any(k=>t.DESC_ART.Contains(k))
?我确实有效!!!Exelent!当它进入数据库时会有效吗?根据一些SO答案,我认为它不会像预期的那样有效。但可能5年后发生了一些变化?:)是的,我忘记了。不,它不是固定的。只需获得数据库的管理员访问权限并编辑表!看,轻松!
var result = db.DAapp.Where(t => keywords.Any(keyword=> string.Equals(keyword,t.DESC_ART, StringComparison.InvariantCultureIgnoreCase )));
static Expression<Func<T, bool>> AnyOf<T>(
params Expression<Func<T, bool>>[] expressions)
{
if (expressions == null || expressions.Length == 0) return x => false;
if (expressions.Length == 1) return expressions[0];
var body = expressions[0].Body;
var param = expressions[0].Parameters.Single();
for (int i = 1; i < expressions.Length; i++)
{
var expr = expressions[i];
var swappedParam = new SwapVisitor(expr.Parameters.Single(), param)
.Visit(expr.Body);
body = Expression.OrElse(body, swappedParam);
}
return Expression.Lambda<Func<T, bool>>(body, param);
}
class SwapVisitor : ExpressionVisitor
{
private readonly Expression from, to;
public SwapVisitor(Expression from, Expression to)
{
this.from = from;
this.to = to;
}
public override Expression Visit(Expression node)
{
return node == from ? to : base.Visit(node);
}
}
var filters = new List<Expression<Func<Models.DAapp, bool>>>();
foreach (var st in keyWords)
filters.Add(d => d.DESC_ART.ToLower().Contains(st.ToLower()));
var lambda = AnyOf(filters.ToArray());
var q = db.DAapp.Where(t =>
t.CODE_ART.StartsWith(s)
&& t.DATE_CREAT >= debut
&& t.DATE_CREAT < fin
);
q = q.Where(lambda);
var res = q.ToList();
var q = db.DAapp.Where(t =>
t.CODE_ART.StartsWith(s)
&& t.DATE_CREAT >= debut
&& t.DATE_CREAT < fin
&& keyWords.Any(k => t.DESC_ART.ToLower().Contains(k.ToLower()))
);