C# 如何为IEnumerable.Any编写Linq.Expression

C# 如何为IEnumerable.Any编写Linq.Expression,c#,linq,linq-expressions,C#,Linq,Linq Expressions,我正在用代码编写查询,代码是linqtosql。我对表达式不是很熟悉,我想写一个表达式来检查IEnumerable中的任何项是否满足条件 public class TestClass1 { // can be any number of properties, with diff names and types public string TestProperty1 { get; set; } public string TestProperty2 { get; set;

我正在用代码编写查询,代码是
linqtosql
。我对表达式不是很熟悉,我想写一个表达式来检查
IEnumerable
中的任何项是否满足条件

public class TestClass1
{
    // can be any number of properties, with diff names and types
    public string TestProperty1 { get; set; }
    public string TestProperty2 { get; set; }
    public List<TestClass1ExtraFieldValue> TestClass1ExtraFieldValueList { get; set; }
}

public class TestClass1ExtraFieldValue
{
    public TestClass1ExtraField TestClass1ExtraField { get; set; }

    // property names below are same in all classes which name ends with ExtraFieldValue
    public int IntValue { get; set; }
    public bool BoolValue { get; set; }
    public DateTime DateTimeValue { get; set; }
    public string StringValue { get; set; }
}

public class TestClass1ExtraField
{
    // property names are same in all classes which name ends with ExtraField
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

public class TestClass2
{
    // can be any number of properties, with diff names and types
    public string TestProperty1 { get; set; }
    public string TestProperty2 { get; set; }
    public List<TestClass2ExtraFieldValue> TestClass2ExtraFieldValueList { get; set; }
}

public class TestClass2ExtraFieldValue
{
    public TestClass2ExtraField TestClass2ExtraField { get; set; }

    // property names below are same in all classes which name ends with ExtraFieldValue
    public int IntValue { get; set; }
    public bool BoolValue { get; set; }
    public DateTime DateTimeValue { get; set; }
    public string StringValue { get; set; }
}

public class TestClass2ExtraField
{
    // property names are same in all classes  which name ends with ExtraField
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

public class TestClass3
{
    // can be any number of properties, with diff names and types
    public string TestProperty1 { get; set; }
    public string TestProperty2 { get; set; }
    public List<TestClass3ExtraFieldValue> TestClass3ExtraFieldValueList { get; set; }
}

public class TestClass3ExtraFieldValue
{
    public TestClass3ExtraField TestClass3ExtraField { get; set; }

    // property names below are same in all classes which name ends with ExtraFieldValue
    public int IntValue { get; set; }
    public bool BoolValue { get; set; }
    public DateTime DateTimeValue { get; set; }
    public string StringValue { get; set; }
}

public class TestClass3ExtraField
{
    // property names are same in all classes which name ends with ExtraField
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

// NOT a DB class
public class ExtraFieldClass
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public int IntValue { get; set; }
    public bool BoolValue { get; set; }
    public DateTime DateTimeValue { get; set; }
    public string StringValue { get; set; }
}
公共类TestClass1
{
//可以是任意数量的属性,具有不同的名称和类型
公共字符串TestProperty1{get;set;}
公共字符串TestProperty2{get;set;}
公共列表TestClassExtraFieldValueList{get;set;}
}
公共类TestClassExtraFieldValue
{
公共TestClassExtraField TestClassExtraField{get;set;}
//以下属性名称在名称以ExtraFieldValue结尾的所有类中都是相同的
公共int值{get;set;}
公共布尔布尔值{get;set;}
公共日期时间日期时间值{get;set;}
公共字符串StringValue{get;set;}
}
公共类testclass1字段
{
//属性名称在名称以ExtraField结尾的所有类中都是相同的
公共字符串属性1{get;set;}
公共字符串属性2{get;set;}
}
公共类TestClass2
{
//可以是任意数量的属性,具有不同的名称和类型
公共字符串TestProperty1{get;set;}
公共字符串TestProperty2{get;set;}
公共列表TestClass2ExtraFieldValueList{get;set;}
}
公共类TestClass2ExtraFieldValue
{
公共TestClass2ExtraField TestClass2ExtraField{get;set;}
//以下属性名称在名称以ExtraFieldValue结尾的所有类中都是相同的
公共int值{get;set;}
公共布尔布尔值{get;set;}
公共日期时间日期时间值{get;set;}
公共字符串StringValue{get;set;}
}
公共类TestClass2ExtraField
{
//属性名称在名称以ExtraField结尾的所有类中都是相同的
公共字符串属性1{get;set;}
公共字符串属性2{get;set;}
}
公共类TestClass3
{
//可以是任意数量的属性,具有不同的名称和类型
公共字符串TestProperty1{get;set;}
公共字符串TestProperty2{get;set;}
公共列表TestClass3ExtraFieldValueList{get;set;}
}
公共类TestClass3ExtraFieldValue
{
公共TestClass3ExtraField TestClass3ExtraField{get;set;}
//以下属性名称在名称以ExtraFieldValue结尾的所有类中都是相同的
公共int值{get;set;}
公共布尔布尔值{get;set;}
公共日期时间日期时间值{get;set;}
公共字符串StringValue{get;set;}
}
公共类TestClass3ExtraField
{
//属性名称在名称以ExtraField结尾的所有类中都是相同的
公共字符串属性1{get;set;}
公共字符串属性2{get;set;}
}
//不是DB类
公共类外场类
{
公共字符串属性1{get;set;}
公共字符串属性2{get;set;}
公共int值{get;set;}
公共布尔布尔值{get;set;}
公共日期时间日期时间值{get;set;}
公共字符串StringValue{get;set;}
}
我有如下查询类:

public class TestClass1Query
{
    public string TestValue1;
    public string TestValue2;

    List<ExtraFieldClass> ExtraFieldsList { get; set; }

    public IQueryable GetQuery()
    {
        var query = GetTestClass1Values().Where(c=> c.TestProperty1==TestValue1 && c.TestProperty2 == TestValue2);
        // some condition checks
        foreach (var extraField in ExtraFieldsList)
        {
            switch (extraField.Type)
            {
                    case FieldType.Boolean:
                    {
                        var boolValue = Convert.ToBoolean(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass1ExtraFieldValueList.Any(t => t.TestClass1ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass1ExtraField.Property2 == extraField.Property2
                                                                                      && t.BoolValue == boolValue));
                        break;
                    }

                    case FieldType.DateTime:
                    {
                        var dateTimeValue = Convert.ToDateTime(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass1ExtraFieldValueList.Any(t => t.TestClass1ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass1ExtraField.Property2 == extraField.Property2
                                                                                      && t.DateTimeValue == dateTimeValue));
                        break;
                    }

                    case FieldType.Text:
                    {
                        var stringValue = Convert.ToString(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass1ExtraFieldValueList.Any(t => t.TestClass1ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass1ExtraField.Property2 == extraField.Property2
                                                                                      && t.StringValue == stringValue));
                        break;
                    }

                    case FieldType.Integer:
                    {
                        var integerValue = Convert.ToInt32(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass1ExtraFieldValueList.Any(t => t.TestClass1ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass1ExtraField.Property2 == extraField.Property2
                                                                                      && t.IntValue == integerValue));
                        break;
                    }
            }
        }
        return query;
    }

    private IQueryable<TestClass1> GetTestClass1Values()
    {
        return null;
    }
}

public class TestClass2Query
{
    public string TestValue1;
    public string TestValue2;

    List<ExtraFieldClass> ExtraFieldsList { get; set; }

    public IQueryable GetQuery()
    {
        var query = GetTestClass2Values().Where(c => c.TestProperty1 == TestValue1 && c.TestProperty2 == TestValue2);
        // some condition checks
        foreach (var extraField in ExtraFieldsList)
        {
            switch (extraField.Type)
            {
                case FieldType.Boolean:
                    {
                        var boolValue = Convert.ToBoolean(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass2ExtraFieldValueList.Any(t => t.TestClass2ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass2ExtraField.Property2 == extraField.Property2
                                                                                      && t.BoolValue == boolValue));
                        break;
                    }

                case FieldType.DateTime:
                    {
                        var dateTimeValue = Convert.ToDateTime(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass2ExtraFieldValueList.Any(t => t.TestClass2ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass2ExtraField.Property2 == extraField.Property2
                                                                                      && t.DateTimeValue == dateTimeValue));
                        break;
                    }

                case FieldType.Text:
                    {
                        var stringValue = Convert.ToString(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass2ExtraFieldValueList.Any(t => t.TestClass2ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass2ExtraField.Property2 == extraField.Property2
                                                                                      && t.StringValue == stringValue));
                        break;
                    }

                case FieldType.Integer:
                    {
                        var integerValue = Convert.ToInt32(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass2ExtraFieldValueList.Any(t => t.TestClass2ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass2ExtraField.Property2 == extraField.Property2
                                                                                      && t.IntValue == integerValue));
                        break;
                    }
            }
        }
        return query;
    }

    private IQueryable<TestClass2> GetTestClass2Values()
    {
        return null;
    }
}

public class TestClass3Query
{
    public string TestValue1;
    public string TestValue2;

    List<ExtraFieldClass> ExtraFieldsList { get; set; }

    public IQueryable GetQuery()
    {
        var query = GetTestClass3Values().Where(c => c.TestProperty1 == TestValue1 && c.TestProperty2 == TestValue2);
        // some condition checks
        foreach (var extraField in ExtraFieldsList)
        {
            switch (extraField.Type)
            {
                case FieldType.Boolean:
                    {
                        var boolValue = Convert.ToBoolean(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass3ExtraFieldValueList.Any(t => t.TestClass3ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass3ExtraField.Property2 == extraField.Property2
                                                                                      && t.BoolValue == boolValue));
                        break;
                    }

                case FieldType.DateTime:
                    {
                        var dateTimeValue = Convert.ToDateTime(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass3ExtraFieldValueList.Any(t => t.TestClass3ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass3ExtraField.Property2 == extraField.Property2
                                                                                      && t.DateTimeValue == dateTimeValue));
                        break;
                    }

                case FieldType.Text:
                    {
                        var stringValue = Convert.ToString(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass3ExtraFieldValueList.Any(t => t.TestClass3ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass3ExtraField.Property2 == extraField.Property2
                                                                                      && t.StringValue == stringValue));
                        break;
                    }

                case FieldType.Integer:
                    {
                        var integerValue = Convert.ToInt32(extraField.Fieldvalue);
                        query = query.Where(c => c.TestClass3ExtraFieldValueList.Any(t => t.TestClass3ExtraField.Property1 == extraField.Property1
                                                                                      && t.TestClass3ExtraField.Property2 == extraField.Property2
                                                                                      && t.IntValue == integerValue));
                        break;
                    }
            }
        }
        return query;
    }

    private IQueryable<TestClass3> GetTestClass3Values()
    {
        return null;
    }
}
公共类TestClassQuery
{
公共字符串TestValue1;
公共字符串TestValue2;
列表外部字段列表{get;set;}
公共IQueryable GetQuery()
{
var query=getTestClassValues()。其中(c=>c.TestProperty1==TestValue1&&c.TestProperty2==TestValue2);
//一些状况检查
foreach(ExtraFieldsList中的var extraField)
{
开关(外部字段类型)
{
大小写字段类型。布尔值:
{
var boolValue=Convert.ToBoolean(extraField.Fieldvalue);
query=query.Where(c=>c.TestClassExtraFieldValueList.Any(t=>t.TestClassExtraField.Property1==extraField.Property1
&&t.testClassExtrafield.Property2==extraField.Property2
&&t.布尔值==布尔值);
打破
}
案例FieldType.DateTime:
{
var dateTimeValue=Convert.ToDateTime(extraField.Fieldvalue);
query=query.Where(c=>c.TestClassExtraFieldValueList.Any(t=>t.TestClassExtraField.Property1==extraField.Property1
&&t.testClassExtrafield.Property2==extraField.Property2
&&t.DateTimeValue==DateTimeValue));
打破
}
案例字段类型。文本:
{
var stringValue=Convert.ToString(extraField.Fieldvalue);
query=query.Where(c=>c.TestClassExtraFieldValueList.Any(t=>t.TestClassExtraField.Property1==extraField.Property1
&&t.testClassExtrafield.Property2==extraField.Property2
&&t.StringValue==StringValue));
打破
}
大小写字段类型。整数:
{
var integerValue=Convert.ToInt32(extraField.Fieldvalue);
query=query.Where(c=>c.TestClassExtraFieldValueList.Any(t=>t.TestClassExtraField.Property1==extraField.Property1
&&t.testClassExtrafield.Property2==extraField.Property2
&&t.IntValue==integerValue));
打破
}
}
var input = new Parameter();
// ...init input
query = query.Where(a => a.Property1 == "sometext");

switch(input.Type)
{
    Case bool:
        var boolValue = Convert.ToBoolean(input.ObjectValue);
        query = query.Where(a => a.Collection.Any(b => b.TestValue.C1 == input.Parameter1 && b.TestValue.C2 == input.Parameter && b.BoolValue == boolValue);
        break;
    Case dateTime :
        // convert to datetime and check
        var dateTimeValue = Convert.ToDateTime(input.ObjectValue);
        query = query.Where(a=> a.Collection.Any(b => b.TestValue.C1 == input.Parameter1 && b.TestValue.C2 == input.Parameter && b.DateTimeValue == dateTimeValue );
        break;
    Case int:
        // convert to int and check
        // ...
        break;
}
public IQueryable<ITest2> ApplyFilterOnQuery(IQueryable<ITest2> query, Parameter input)
{
    switch(input.Type)
    {
        Case bool:
            var boolValue = Convert.ToBoolean(input.ObjectValue);
            query = query.Where(a => a.Collection.Any(b => b.TestValue.C1 == input.Parameter1 && b.TestValue.C2 == input.Parameter && b.BoolValue == boolValue);
            break;
        Case dateTime :
            // convert to datetime and check
            var dateTimeValue = Convert.ToDateTime(input.ObjectValue);
            query = query.Where(a => a.Collection.Any(b => b.TestValue.C1 == input.Parameter1 && b.TestValue.C2 == input.Parameter && b.DateTimeValue == dateTimeValue );
            break;
        Case int:
            // convert to int and check
            // ...
            break;
    }
    return query;
}
var input = new Parameter();
// ...init input
query = query.Where(a => a.Property1 == "sometext");
query = ApplyFilterOnQuery(query, input);