Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 尝试使用动态LINQ,但不要';我不知道从哪里开始?_C#_Linq_Blazor - Fatal编程技术网

C# 尝试使用动态LINQ,但不要';我不知道从哪里开始?

C# 尝试使用动态LINQ,但不要';我不知道从哪里开始?,c#,linq,blazor,C#,Linq,Blazor,我有一个Blazor应用程序,它显示一个事件日志,还有一个多选项下拉列表,可以输出一个可拆分的字符串,用于过滤“SourceContext”类型。我想动态地构建下面这样的“Where”子句,下面的代码显然不起作用,但代表了我试图实现的目标。 我已经尝试过谓词,并阅读了一些动态LINQ站点来解决这个问题,现在我完全搞糊涂了。谢谢你在这方面的帮助 string[] strAr = str.ToString().Split(","); string ctxFlt =

我有一个Blazor应用程序,它显示一个事件日志,还有一个多选项下拉列表,可以输出一个可拆分的字符串,用于过滤“SourceContext”类型。我想动态地构建下面这样的“Where”子句,下面的代码显然不起作用,但代表了我试图实现的目标。 我已经尝试过谓词,并阅读了一些动态LINQ站点来解决这个问题,现在我完全搞糊涂了。谢谢你在这方面的帮助

    string[] strAr = str.ToString().Split(",");
    string ctxFlt = string.Empty;
    for (int x = 1; x < strAr.Count(); x++)
    {
        if (x == 1)
        {
            ctxFlt += strAr[x].ToString();
        }
        else
        {
            ctxFlt += " and s.SourceContext ==  strAr[x].ToString();
        }
    }
    evLog = logdb.Logs.Where(s => s.SourceContext == $"{ctxFlt}").OrderByDescending(t => t.Timestamp).ToList();
string[]strAr=str.ToString().Split(“,”);
string ctxFlt=string.Empty;
对于(int x=1;xs.SourceContext==$“{ctxFlt}”).OrderByDescending(t=>t.Timestamp.ToList();

同意Robert的观点,Contains应该足够了,但您需要的是一个列表(enum)而不是.Contains的数组。您的Contains实现是“字符串中的字符串”即foobar.Contains(foo)而不是Linq Contains来构建SQL“WHERE”字段(x,y,z)

但是如果您想要一个完整的动态查询,您可以执行以下操作

using System.Linq.Expressions;

            string[] strAr = str.ToString().Split(",");
            Expression conditions = Expression.Constant(false);
            var parameter = Expression.Parameter(typeof(Log), "log");

            for (int i = 0; i < strAr.Count(); i++)
            {
                Expression condition = Expression.Equal(
                        Expression.Property(parameter, "SourceContext"),
                        Expression.Constant(strAr[i])
                        );

                conditions = Expression.OrElse(conditions, condition);
            }

            var expression = Expression.Lambda<Func<Log, Boolean>>(conditions, parameter);

            var q = evLog = logdb.Logs.Where(expression).OrderByDescending(t => t.Timestamp).ToList();
使用System.Linq.Expressions;
字符串[]strAr=str.ToString().Split(“,”);
表达式条件=表达式常数(false);
var参数=表达式参数(typeof(Log),“Log”);
对于(int i=0;it.Timestamp).ToList();

同意Robert的观点,Contains应该足够了,但您需要的是一个列表(enum)而不是.Contains的数组。您的Contains实现是“字符串中的字符串”即foobar.Contains(foo)而不是Linq Contains来构建SQL“WHERE”字段(x,y,z)

但是如果您想要一个完整的动态查询,您可以执行以下操作

using System.Linq.Expressions;

            string[] strAr = str.ToString().Split(",");
            Expression conditions = Expression.Constant(false);
            var parameter = Expression.Parameter(typeof(Log), "log");

            for (int i = 0; i < strAr.Count(); i++)
            {
                Expression condition = Expression.Equal(
                        Expression.Property(parameter, "SourceContext"),
                        Expression.Constant(strAr[i])
                        );

                conditions = Expression.OrElse(conditions, condition);
            }

            var expression = Expression.Lambda<Func<Log, Boolean>>(conditions, parameter);

            var q = evLog = logdb.Logs.Where(expression).OrderByDescending(t => t.Timestamp).ToList();
使用System.Linq.Expressions;
字符串[]strAr=str.ToString().Split(“,”);
表达式条件=表达式常数(false);
var参数=表达式参数(typeof(Log),“Log”);
对于(int i=0;it.Timestamp).ToList();

出于本能,我觉得您不需要使用动态Linq或谓词生成器来实现此目的。这似乎是
包含()
,或者可能是
除了()
。请参阅以获取一些线索。我完全同意您的看法。包含正是我想要使用的。问题是当我尝试将筛选器变量连接起来时,它看起来像“a、 b,c“我没有返回任何记录。如果我只使用一个变量,它就会工作。ctxFlt+=strAr[x].ToString();…其中e.SourceContext.Contains(ctxFlt)…Contains是向后的-试试where(s=>strArs.Contains(s.SourceContext)),本能地,我觉得你不需要动态Linq或谓词生成器来完成这项工作。似乎是
Contains()
,或者可能是
Except()
。请参阅以获取一些线索。我完全同意您的观点。Contains正是我希望使用的内容。问题是,当我尝试将筛选器变量连接为“a,b,c”时,我没有返回任何记录。如果我只使用一个变量,它就会工作。ctxFlt+=strAr[x]。ToString();…e.SourceContext.Contains(ctxFlt)…Contains是向后的-试试where(s=>strArs.Contains(s.SourceContext))是的,我把原来的“Contains”向后放了,我不知道数组必须先计算。上面的“Contains”是有效的答案。谢谢Robert和Mike!是的,我有原来的“Contains”“如前所述。我不知道必须先对数组求值。上述“包含”是有效答案。谢谢罗伯特和迈克!