我有这样的查询,但我希望能够动态选择。
是否可以使用变量进行选择,这样您就可以使用X
string x = "cat"
然后它将选择所有猫
var Query = from a in db.MyDb
where a.Id.Equals(UserId)
select a.Animal.X;
答案 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));