【问题标题】:What is the best way to return an entity with EF5.0?使用 EF5.0 返回实体的最佳方式是什么?
【发布时间】:2014-08-05 08:39:45
【问题描述】:

我写了这小部分代码

            var query = from u in context.Users
                        join ui in context.UserIdentifiers on u.id equals ui.user_fk
                        where ui.identifier_value == identifier
                        select new User = u;

此代码错误,因为最后一行select new User = u;

所以我写了这个

            var query = from u in context.Users
                        join ui in context.UserIdentifiers on u.id equals ui.user_fk
                        where ui.identifier_value == identifier
                        select new User
                        {
                            id = u.id,
                            first_name = u.first_name,
                            last_name = u.last_name
                        };
            return query.First();

我不喜欢这段代码,因为我需要手动映射所有变量:id = u.id, first_name = u.first_name, last_name = u.last_name。如果我忘记了一个或者我修改了我的实体并且我忘记更新这部分代码怎么办。如果我得到一个超过 3 个变量的实体怎么办。我正在寻找一种更好的方法来写这个。你能帮帮我吗?

【问题讨论】:

  • 啊,是的,我更喜欢使用 Linq,而不是 Lambda。
  • 为什么不将 'select new User { ... }' 部分替换为 'select u' ?

标签: c# entity-framework entity-framework-5


【解决方案1】:

如果User 是实体类型:

var query = from u in context.Users
   join ui in context.UserIdentifiers on u.id equals ui.user_fk
   where ui.identifier_value == identifier
   select u;
return query.FirstOrDefault();

如果没有,那么你必须映射:

select new User
{
   id = u.id,
   first_name = u.first_name,
   last_name = u.last_name
};

或使用

query.ToList().Select(u => new User(u)).FirstOrDefault()

并实现一个合适的构造函数。

【讨论】:

  • 我选择返回查询的解决方案。FirstOrDefault();这将返回我的实体对象 u。由于多态性,你已经是可序列化的、可粗略的和可大量使用的。我不需要映射任何东西。完美的。谢谢。
  • @B413 如果您只想要实体类型,为什么还要创建一个 User 类?
【解决方案2】:

您遇到的问题是不同的类,您选择表 Users,但您使用的是类 User
因此,如果您有可能,请使用您的课程Users。然后您可以直接在查询中选择您的实体:

var query = from u in context.Users
            join ui in context.UserIdentifiers on u.id equals ui.user_fk
            where ui.identifier_value == identifier
            select u;

但我也知道这并不总是可能的,在某些项目中我们也有类似的问题。没有集成的可能性来自动转换您的类。

尽管如此,有一个名为Automapper 的工具,您可以使用它来转换您的课程。例如,您可以像这样将两个类映射在一起:

Mapper.CreateMap<Users, User>();

这样做的好处是,如果它们在两个类中具有相同的名称,您不必告诉 automapper 要映射哪些属性。

然后你可以像这样自动映射所有属性:

var user = Mapper.Map<User>(query.First());

【讨论】:

  • 是的,我知道映射器的解决方案,但是如果你使用这种类,你就不明白什么是面向对象,因为你不尊重面向对象概念的不要重复自己的规则。
  • 没有别的办法,因为你使用了两个不同的类Users和User。没有什么能比得上类似属性的自动映射。您唯一的方法是使用映射器工具或使用实体类型(或手动映射;-))
猜你喜欢
  • 2018-10-01
  • 2018-05-16
  • 1970-01-01
  • 2020-02-26
  • 2016-07-01
  • 2017-05-17
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多