使用linq,我试图实现以下逻辑-
Iqueryable.Select(q=> new {
if a then q.field1,q.field2,q.field3
else if b then q.field1, q.field4
else q.field5,q.field6,q.field7,q.field8
});
有什么最好的方法吗?
您当然可以将其封装到一个返回dynamic
的方法中,尽管您失去了类型安全性,并且始终具有动态性能。
public dynamic DynamicSelect(Expression<Func<Address, dynamic>> query)
{
return Addresses.Select(query).Take(1).ToList();
}
然后,您可以调用它并从中检索数据,如下所示:
var result = DynamicSelect(q => new {q.Id, q.AddressLine1});
Console.WriteLine(result[0].Id);
当使用DbSets
时,您甚至可以更进一步并将其通用化:
public dynamic DynamicSelect<TEntity>(Expression<Func<TEntity, dynamic>> query)
{
return context.DbSet<TEntity>.Select(query).Take(1).ToList();
}
就我个人而言,我会问自己这种灵活性是否真的有必要。你正在扼杀你的类型安全,只为"灵活性"的边际增加。
我想你可以试试这个
IQueryable query;
if (a)
query.Select(q=> new {q.field1,q.field2,q.field3});
else if (b)
query.Select(q=> new {q.field1, q.field4});
else
.Select(q=> new {q.field5,q.field6,q.field7,q.field8});