C# 动态构建EF查询

C# 动态构建EF查询,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我正在为一个项目开发一个动态查询解决方案。我想避免使用一堆if/else或switch语句来更改这些查询的[DynamicFieldName]部分 IQueryable<MyDataType> allItems = (from item in Context.MyDataTypes select item); foreach (QueryEntry currentEntry in query.Fields) {

我正在为一个项目开发一个动态查询解决方案。我想避免使用一堆if/else或switch语句来更改这些查询的[DynamicFieldName]部分

        IQueryable<MyDataType> allItems = (from item in Context.MyDataTypes select item);

        foreach (QueryEntry currentEntry in query.Fields)
        {
            allItems = allItems.Where(item => item.[DynamicFieldName] == currentEntry.Value);
        }
IQueryable allItems=(从Context.MyDataTypes中的项选择项);
foreach(query.Fields中的QueryEntry currentEntry)
{
allItems=allItems.Where(item=>item.[DynamicFieldName]==currentEntry.Value);
}
用户可以通过具有可变字段数的GUI构建查询。最后,它们还可以选择各种不同数据类型的比较(小于、大于、等于、包含等)


我可以使用什么方法以良好的可重用方式以编程方式构建此代码?

请查看以下代码:

public static class CustomQueryBuilder
{
    //todo: add more operations
    public enum Operator
    {
        Equal = 0,
        GreaterThan = 1,
        LesserThan = 2
    }

    public static IQueryable<T> Where<T>(this IQueryable<T> query, string property, Operator operation, object value)
    {
        //it's an item which property we are referring to
        ParameterExpression parameter = Expression.Parameter(typeof(T));
        //this stands for "item.property"
        Expression prop = Expression.Property(parameter, property);

        //wrapping our value to use it in lambda
        ConstantExpression constant = Expression.Constant(value);

        Expression expression;
        //creating the operation
        //todo: add more cases
        switch (operation)
        {
            case Operator.Equal:
                expression = Expression.Equal(prop, constant);
                break;
            case Operator.GreaterThan:
                expression = Expression.GreaterThan(prop, constant);
                break;
            case Operator.LesserThan:
                expression = Expression.LessThan(prop, constant);
                break;
            default:
                throw new ArgumentException("Invalid operation specified");
        }

        //create lambda ready to use in queries
        var lambda = Expression.Lambda<Func<T, bool>>(expression, parameter);

        return query.Where(lambda);
    }
}
这等于

var users = context
    .Users
    .Where(u => u.Name == "User")
    .ToList();

这很可能就是我要找的。我明天去看看。
var users = context
    .Users
    .Where(u => u.Name == "User")
    .ToList();