我正在寻求一些有关使用实体框架的建议,以及从MVC应用程序调用的WCF服务。
我有一个ASP.NET MVC Web应用程序作为表示层,它调用WCF服务,该服务执行所有数据操作。 WCF应用程序使用实体框架在DB上执行操作。
问题在于,根据正在呈现的页面,数据库所需的信息将发生变化,例如,如果我想显示所有用户的列表,我可能只想要他们的用户名,但WCF服务将返回整个模型,当处理大量记录时,这显然变得非常低效。
有没有办法提高效率,需要以某种方式在Linq语句中指定Include和Select的值
答案 0 :(得分:1)
如果我说得对,你实际上是在说Models
与Views
的需求不符。
这是(原因之一)为什么人们使用Data Transfer Objects (DTO)
作为从数据服务返回的对象,而不是实体本身。
通常,您需要project / map
您的实体加入DTO对象。
例如,如果我想显示我可能只是的所有用户的列表 想要他们的用户名,但WCF服务将返回整个模型
对于这种特殊情况,你可以尝试这样的事情:
// Your 'User' Entity
public class User : BaseEntity
{
public int Id { get; set; }
public string Username { get; set; }
public string Email { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Phone> Phones { get; set; }
}
// Base class for all 'Mappable' DTOs
public abstract class Mappable<ENTITY, DTO> where ENTITY : BaseEntity
{
public abstract DTO ToDTO(ENTITY entity);
}
// Your DTO (specific to your grid needs)
public class UsersGridDTO : Mappable<User, UsersGridDTO>
{
public int Id { get; set; }
public string Username { get; set; }
public override UsersGridDTO ToDTO(User entity)
{
return new UsersGridDTO
{
Id = entity.Id,
Username = entity.Username
};
}
}
// In your WCF data service
public IEnumerable<DTO> GetData<DTO>() where DTO : Mappable<Entity, DTO>, new()
{
return efContext.Users.Select(new DTO().ToDTO);
}
此外,使用Asp.Net MVC时,DTO 也可用作ViewModels
(请参阅here)。
你也可以使用像AutoMapper
这样可以为你处理实体到DTO映射的框架。