如何使用匿名对象创建动态 Linq Select 表达式

3

我正在使用Entity Framework在一个表上运行查询。然而,我需要仅获取选择的列。

class MyEvent
{
    public string Name { get; set; }
    public int Id { get; set; }
    virtual Stage EventStage { get; set; }
    ..... more columns .....
}

class Stage
{
    public string Name { get; set; }
    public string Location { get; set; }
    ..... more columns .....
}

我可以编写一个 IQueryable 来返回这些内容

dbContext.MyEvents
         .Select(s =>
            new {
                    Name = s.Name,
                    Id = s.Id,
                    EventStage = new
                    {
                        Name = s.EventStage.Name,
                        Id = s.EventStage.Id
                    }
                }
           )
           .ToList();

这个代码可以如预期地工作,给我所感兴趣的那些列。
现在,我需要使用表达式树动态构建“Select”调用,类似于这里
我该如何实现呢?通过表达式构建匿名对象像上面那样是可行的吗?
编辑:我的用例是我有一个通用的dB上下文类,它接受要提取的列的字符串列表。过去,我们返回所有列,忽略该输入列表。因此,现在我需要动态生成选择语句,仅返回所需的子列,可以通过匿名对象或动态创建的DTO来完成。
谢谢

你能举个你想要的用法的例子吗? - Michael
匿名类在编译时是真正的类。因此,在运行时创建 lambda 也需要在运行时构造类。使用反射创建类类型和其中的字段,然后使用它构造查询(我自己没有做过这个,因为它很奇怪)。 - Szer
@Michael:更新了用例。 - sppc42
为什么需要返回匿名类型?为什么不能创建一个强类型对象? - Benjamin Drolet
我删除了我的回答,因为@BenjaminDrolet是正确的。使用DTO对象从您的模型中仅返回所需内容。匿名类型似乎是简单的方法,但也要考虑代码的可读性和API文档化。 - Michael
2个回答

0
也许你可以使用这里的ToDynamic方法:

https://gist.github.com/volak/20f453de023ff75edeb8

一个可能的使用案例是: 让用户选择要显示的列并仅查询这些选定的列,这样您就不必总是从数据库中查询整个实体。

-3

定义一个强类型对象并返回它。我建议避免使用动态对象。

注意:您不能返回匿名对象。


不确定我的回答发生了什么事,所以我重新发布了它。 - Benjamin Drolet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接