动态选择LINQ

时间:2015-04-15 17:08:22

标签: linq entity-framework

我有这样的查询,但我希望能够动态选择。

是否可以使用变量进行选择,这样您就可以使用X

之类的内容来代替string x = "cat"

然后它将选择所有猫

var Query = from a in db.MyDb
            where a.Id.Equals(UserId)
            select a.Animal.X;

1 个答案:

答案 0 :(得分:0)

如果选定的属性具有相同的类型,则可以执行动态选择。

让我们看一个简化的例子:

    class Animal
    {
        public string Cat { get; set; }
        public string Dog { get; set; }
        public int PropertyWithDifferentType { get; set; }
    }

    var animals = new List<Animal>();
    animals.Add(new Animal { Cat = "cat", Dog = "a dog", 
        PropertyWithDifferentType = 42 });

可以像这样进行简单的动态选择:

var selector  = 0;
var result = animals.Select(a => (selector == 0) ? a.Dog : a.Cat);

但是,由于类型不同,以下语句将产生编译错误:

 var doesNotCompile = animals.Select(a => (selector == 0) ? a.Dog : a.PropertyWithDifferentType);

如果动态选择是更大的表达式,您可能需要为它定义一个函数,如:

Func<string> myPropertySelector(Animal a, int selector) {
    switch (selector) {
            case 0: return () => a.Dog;
            default: return ()=> a.Cat;
    }
}

示例用法是:

var result = animals.Select(a => myPropertySelector(a, selector));

将所有内容放在一起您的查询可能如下所示(我个人更喜欢方法语法):

var Query = db.MyDb
           .Where(a => a.Id == UserId)
           .Select(a => myPropertySelector(a.Animal, selector));