【问题标题】:dynamically specify select columns linq动态指定选择列 linq
【发布时间】:2016-07-20 22:19:26
【问题描述】:

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

有什么好的方法可以做到这一点吗?

【问题讨论】:

  • 你想动态改变表达式的返回类型? This may be the essence of the answer,但是当你完成时,这将是一个非常冗长的 linq 表达式。
  • 你只能通过返回一个动态来做到这一点。匿名类型是类型安全的。你正在做的不是。我可能有一些代码给你,但它正在工作。我根据字符串输入动态创建匿名类型。但这一切都在工作,我有一个假期:)
  • @S.Akbari 不起作用
  • @Michael 听起来不错,很想看看
  • 发现了类似的东西here。也许你可以以某种方式使用它。否则,我会在大约两周后恢复工作时与您联系。

标签: c# linq dynamic func


【解决方案1】:

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

我个人会问自己,这种灵活性是否真的有必要。您正在扼杀您的类型安全性以略微增加“灵活性”。

【讨论】:

  • 谢谢,我不会失去任何性能,但我确实需要不断更改我的字段列表。我不想要一个长的 if 语句,因为我可以有很多条件 - 比如 if a then if nestedCondtion&&secondNestedCondition then.... else if nestedCondition then.... else if b...
  • @MikeTurner 如果存在可证明 性能下降。我不能向你保证有或没有。这取决于你的情况。但与动态一样,它需要被调用。
  • 甚至不确定这对我有什么用。我真正喜欢的是 - if condition - 添加 fieldOne 以选择,if conditionTwo - 添加 fieldTwo 以选择,if conditionThree --- 添加 fieldThree 以选择等。
  • 如果我可以将 propertyInfo 列表传递到我的 .Select(q=> listPropInfo) 中,效果会很好
  • @MikeTurner 你不能更改Select() 的签名...就是这样。您所能做的就是在方法的上下文中工作。它需要一个接受类型并返回新类型的表达式。所以你必须解决这个问题。如果您可以不再需要使用匿名类型,而是使用具有所有潜在字段的具体类型,这将成为一个更容易的问题。
【解决方案2】:

我觉得你可以试试这样的

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

【讨论】:

  • 一直在寻找更具动感的东西……比如匿名函数或更酷的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2017-09-25
相关资源
最近更新 更多