【问题标题】:Inline function call in Queryable Select可查询选择中的内联函数调用
【发布时间】:2013-10-25 12:47:25
【问题描述】:

我需要一些帮助来处理数据项的 IQueryable 集合,然后将它们选择到新表单中。

调用以下方法从存储库中获取一些数据:

var data = this.repository.GetAllPersonalDetails();

然后我想将集合中的每个项目转换为我使用以下操作的业务对象:

var businessTypes = data.Select(dataType => new PersonalDetails
    {
        FirstName = dataType.FirstName
        ...etc.
    });

这很好用,一切都很好,但是业务对象非常大,我想利用一个适配器函数将数据对象映射到业务对象。但是,如果我使用类似于以下的代码:

var businessTypes = data.Select(dataType => this.ConvertToBusinessObject(dataType));

然后整个 Queryable 管道就搞砸了,最终执行查询时出现异常。

有谁知道我正在尝试做的事情是否可行?如果我们使用适配器函数在多个地方的对象之间进行转换,那就太好了,我宁愿重复使用它们,而不是必须进行完整的内联转换。

【问题讨论】:

    标签: c# linq iqueryable


    【解决方案1】:

    问题是,必须在某个地方定义从存储库对象到业务对象的映射。如果没有这个或像你一样使用 LINQ 选择,你将无法让它工作。

    有许多不同的 ORM(对象关系映射器)将数据库对象映射到业务对象,但即使它们也必须生成一些适配器。例如,Entity Framework 使用模板来生成映射类并将它们隐藏在上下文类型下,这样您就不会被它打扰。

    如果您不想或不能使用任何现有的映射器,您可以编写自己的适配器。当您谈论适配器时,我假设您已经知道如何完成它们。

    【讨论】:

    • 感谢 Ondrej 的回复。上述 sn-p 中提到的存储库是使用目前运行良好的 LLBLGen ORM 工具实现的。转换是在 LLBLGen 实体类型到我们自己的 Busines 实体类型之间进行的。我们无法切换到 EF,但我可能会查找您提到的上下文类型。干杯。
    • @Apogee 很遗憾地通知您,没有简单的方法。希望我的回答能让你对这个问题的思考更加清晰。
    • 我最终遵循了这个答案中给出的指导 - stackoverflow.com/questions/5523792/… - 不过感谢您的帮助。
    【解决方案2】:

    回答我自己的问题,这个问题的答案中给出的指导对我来说非常有效。

    Converting IQueryable<T> object to another object?

    【讨论】:

      【解决方案3】:

      AutoMapper 就是你要找的。​​p>

      AutoMapper 是一个简单的小库,旨在解决看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码。

      【讨论】:

      • 对我来说听起来像是广告。考虑提供短代码 sn-p 而不是这种廉价的描述。
      • 这不是广告;所有开源项目都可供使用和学习。
      • 当然,但是这个糟糕的描述如何比提供的链接更有帮助? SO 的经验法则是,您的答案不仅应包括指向有用网站的链接,还应包含使用该工具的短代码 sn-p,因为某些网站会在一段时间后死掉,但代码 sn-ps所以不要在这里。
      • 因此,请取最短的一个也相关的并将其发布在您的答案中,而不是非陈述性描述中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多