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