使用EF5.0返回实体的最佳方法是什么?

时间:2014-08-05 08:39:46

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

我写了这段代码

            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个变量的实体怎么办?我正在寻找一种更好的方式来写这篇文章。你能帮帮我吗?

2 个答案:

答案 0 :(得分: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()

并实现合适的构造函数。

答案 1 :(得分:1)

您遇到的问题是不同的类,您选择表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());