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_List - Fatal编程技术网

C# 动态创建linq表达式或解析表达式的字符串值

C# 动态创建linq表达式或解析表达式的字符串值,c#,linq,list,C#,Linq,List,遇到了一个问题,我需要动态包装linq表达式。但我似乎不能把我的头围绕着它 所以首先我有一个复选框。在这里,我从选定的文件中输入值,因此在运行代码之前,我不知道有多少参数。然后计划基于复选框中元素的名称构造一个linq语句。让我举例说明: 我想创建一个linq语句,如下所示: var result = from n in data where n.Item1 == "someValueFromCheckBox" select n; var result = from n in data wh

遇到了一个问题,我需要动态包装linq表达式。但我似乎不能把我的头围绕着它

所以首先我有一个复选框。在这里,我从选定的文件中输入值,因此在运行代码之前,我不知道有多少参数。然后计划基于复选框中元素的名称构造一个linq语句。让我举例说明: 我想创建一个linq语句,如下所示:

var result = from n in data where n.Item1 == "someValueFromCheckBox"  select n;
var result = from n in data where n.Item1 == "someValueFromCheckBox" || n.Item1 == "someValueFromCheckBox1" select n;
var result = from n in data where n.Item1 == linqStatement  select n;
其中,数据是一个元组列表,如:

List<Tuple<string, string>> 
因此,我的第一个想法是将linq语句构建为字符串。以下列方式:

        var selectedItems = checkedListBoxSelectedTerms.CheckedItems;
        var linqStatement = "";
        for (int i = 0; i < selectedItems.Count; i++ )
        {          
                linqStatement += selectedItems[i].ToString() + "|| n.item1 ==" ;                                  
        }
        //this is simply to remove the || "n.Item1 ==", at the end because it 
        is not needed after the last selecteditem. 
        linqStatement = linqStatement.Remove(linqStatement.Length - 13, 13);
整件事都成了一根绳子。我不能让“n.Item1==”成为字符串。理论上,该解决方案对我的使用非常有用,因为我不必担心复选框中有多少个元素以及用户选择了多少个元素,但我不能将linqStatement作为字符串整体传递。因此,任何帮助都是值得的,因为我似乎找不到一个好的例子来做这样的事情


提前谢谢

PredicateBuilder是我用于动态查询的工具

有关更多信息,请参见此处:


因此,您要寻找的是谓词生成器的实现,它可以将任意数量的表达式和/或它们结合在一起。以下是一个可用于任何查询提供程序的实现:

public static class PredicateBuilder
{
    public static Expression<Func<T, bool>> True<T>() { return f => true; }
    public static Expression<Func<T, bool>> False<T>() { return f => false; }

    public static Expression<Func<T, bool>> Or<T>(
        this Expression<Func<T, bool>> expr1,
        Expression<Func<T, bool>> expr2)
    {
        var secondBody = expr2.Body.Replace(expr2.Parameters[0], 
            expr1.Parameters[0]);
        return Expression.Lambda<Func<T, bool>>
              (Expression.OrElse(expr1.Body, secondBody), expr1.Parameters);
    }

    public static Expression<Func<T, bool>> And<T>(
        this Expression<Func<T, bool>> expr1,
        Expression<Func<T, bool>> expr2)
    {
        var secondBody = expr2.Body.Replace(expr2.Parameters[0], 
            expr1.Parameters[0]);
        return Expression.Lambda<Func<T, bool>>
              (Expression.AndAlso(expr1.Body, secondBody), expr1.Parameters);
    }
}
这允许您获取任意两个表达式并创建一个新的表达式,该表达式是将它们组合在一起的结果

List<Tuple<string, string>> list = CreateList();

var finalExpression = list.Aggregate(PredicateBuilder.False<Data>(),
        (predicate, pair) => predicate.Or(n => n.Item1 == pair.Item2));

var query = data.Where(finalExpression);
List List=CreateList();
var finalExpression=list.Aggregate(PredicateBuilder.False(),
(谓词,pair)=>predicate.Or(n=>n.Item1==pair.Item2));
var query=data.Where(finalExpression);

对于这样一个简单的示例,您只需使用字符串的or,然后执行
包含
。例如

var selectedItems = checkedListBoxSelectedTerms.CheckedItems
                        .Select(x => x.ToString()).ToList();
var result = from n in data where selectedItems.Contains(n.Item1) select n;

如果您需要更灵活的动态构建功能,请尝试类似于或的功能。

好吧,我现在觉得很愚蠢:D这对我的使用效果很好。我真的需要更好地学习linq!谢谢所有其他的回复!
var selectedItems = checkedListBoxSelectedTerms.CheckedItems
                        .Select(x => x.ToString()).ToList();
var result = from n in data where selectedItems.Contains(n.Item1) select n;