动态LINQ与数据对象

时间:2010-10-27 01:25:32

标签: linq dynamic c#-4.0 expression-trees

所以我一直在寻找一个简单的例子,希望这是一个简单的问题。

我有一个简单的对象List of ListTest(List)

public class ListTest{
{
    public string perName { get; set; }
    public string perSex { get; set; }
    public ListTest(string pName, string pSex)
    {
        this.perSex = pSex;
        this.perName = pName;
    }
}

我已经加载了一些数据:

        List<ListTest> tryIt = new List<ListTest>();
        tryIt.Add(new ListTest("Karen", "F"));
        tryIt.Add(new ListTest("Kate", "F"));
        tryIt.Add(new ListTest("Glen", "M"));
        tryIt.Add(new ListTest("Tiger", "M"));
        tryIt.Add(new ListTest("Clementine", "F"));
        tryIt.Add(new ListTest("Magnolia", "F"));

现在我想使用Lambda Expression查询它:

        var things = tryIt
                     .Where(sex => (sex.perSex == "F"))
                     .OrderBy(sex => sex.perName);

但我想动态地做,以防万一我想改变“perName”的位置。

我能够创建Lambda Expression你的表达式,但我无法弄清楚如何跨越目标线并将其实际分配给where子句并执行它。

        IQueryable<ListTest> iq = tryIt.AsQueryable();
        ParameterExpression pe = Expression.Parameter(typeof(ListTest), "Person");
        Expression paEx = Expression.Property(pe, "perSex");
        Expression right = Expression.Constant("F");
        Expression eqEx = Expression.Equal(paEx, right);
        Expression lE = Expression.Lambda<Func<ListTest, bool>>(eqEx, pe);

这应该是一个简单的4或5行解决方案,但我找不到一个容易破解的解决方案示例。

我应该在这些行中使用MethodCallExpression吗?

谢谢,

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

IEnumerable<ListTest> things = tryIt;

if (someBooleanLogic)
    things = things.Where(l => l.perSex == "F");
else
    things = things.Where(l => l.perName == "Tiger");

things = things.OrderBy(sex => sex.perName);

List<ListTest> filteredAndSorted = things.ToList();

修改

或者,也有流行的LINQ Dynamic Query Library,您可以根据需要形成您的查询(当然是动态的)。

答案 1 :(得分:0)

我在post找到了最优雅的解决方案。它允许我构建一个非常灵活和清晰的解决方案,而不会陷入参数地狱。