Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体,包含或相交,是否可以进行此查询?_C#_Entity Framework - Fatal编程技术网

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