如何将linq查询转换为动态查询?

时间:2016-06-12 07:51:25

标签: c# entity-framework linq linq-to-entities dynamic-programming

我想创建linq查询,该查询应该足够动态以获取特定类的所有属性,并为linq中的“where”和“select”构建表达式树。

有一个域模型,它由bool属性和数字属性组成。数字属性将用于范围。

示例:

域模型

 public class MakeMeReal
    {
        public bool isA { get; set; }
        public bool isB { get; set; }

        public int Type1 { get; set; }
        public double Type2 { get; set; }

        public double Type3 { get; set; }
        public string Type4 { get; set; }

    }

输入模型:

  public class LinqDynamic
    {
        public bool isA { get; set; }
        public bool isB { get; set; }

        public int lowerRangeForTyp1 { get; set; }
        public int UpperRangeForTyp1 { get; set; }

        public double LowerRangeForType2 { get; set; }
        public double UpperRangeForType2 { get; set; }
    }

简单查询:

public void query(LinqDynamic dynamicInput)
        {
            SampleDbContext db = new SampleDbContext();

            var result = from m in db.MakeMeReal
                         where m.isB == dynamicInput.isB && m.isA == dynamicInput.isA &&
                               m.Type1 >= dynamicInput.lowerRangeForTyp1 && m.Type1 < dynamicInput.UpperRangeForTyp1 &&
                                m.Type2 >= dynamicInput.LowerRangeForType2 && m.Type1 < dynamicInput.UpperRangeForType2

                         select new { a = m.Type1, b = m.Type2, c = m.Type3, d = m.Type4 }; 

        }

我想构建将通过域模型的查询,它将构建表达式树,并且它将针对将在运行时使用“LinqDynamic”类作为输入参数提供的输入运行。

我有超过10个布尔值和30个范围选择器,布尔值和范围选择器的数量根据项目要求不断变化,因此每次更改查询都很头疼。我想让它变得动态,以便它对任何变化都是不可知的

我读到了https://msdn.microsoft.com/en-us/library/bb397951.aspx和其他一些由于缺乏声誉而无法在此发布的链接

但我不确定如何实现它

1 个答案:

答案 0 :(得分:0)

在查询中使用谓词可能会有所帮助。有一个NuGet包可以帮助你做。文档将解释如何执行此操作。见LINQKit here