动态指定select列linq

本文关键字:linq select 动态 | 更新日期: 2023-09-27 17:57:55

使用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
});

有什么最好的方法吗?

动态指定select列linq

您当然可以将其封装到一个返回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});