C# 尝试使用动态LINQ,但不要';我不知道从哪里开始?
我有一个Blazor应用程序,它显示一个事件日志,还有一个多选项下拉列表,可以输出一个可拆分的字符串,用于过滤“SourceContext”类型。我想动态地构建下面这样的“Where”子句,下面的代码显然不起作用,但代表了我试图实现的目标。 我已经尝试过谓词,并阅读了一些动态LINQ站点来解决这个问题,现在我完全搞糊涂了。谢谢你在这方面的帮助C# 尝试使用动态LINQ,但不要';我不知道从哪里开始?,c#,linq,blazor,C#,Linq,Blazor,我有一个Blazor应用程序,它显示一个事件日志,还有一个多选项下拉列表,可以输出一个可拆分的字符串,用于过滤“SourceContext”类型。我想动态地构建下面这样的“Where”子句,下面的代码显然不起作用,但代表了我试图实现的目标。 我已经尝试过谓词,并阅读了一些动态LINQ站点来解决这个问题,现在我完全搞糊涂了。谢谢你在这方面的帮助 string[] strAr = str.ToString().Split(","); string ctxFlt =
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”“如前所述。我不知道必须先对数组求值。上述“包含”是有效答案。谢谢罗伯特和迈克!