0

我正在使用 MVC4 和实体框架。我想让 ApiController 称为 UserController 来根据用户的属性查询用户。我的用户实体具有姓名、电话号码、地址(复杂类型)等属性,应该可以根据这些数据查询和检索用户。但是用户也有我不想看到的密码、lastsync 等属性。目前我没有解决方案。以下为我提供了用户,但包括所有实体,以及我不想显示的实体。

public class UserController : BaseApiController
{
    public IQueryable<User> Get()
    {
        // _db is my entity framework DbContext
        return _db.Users; 
    }
}

我以为我会将所有“公开”可见属性移至 ApiUser 类,并使 User 从 ApiUser 派生。然后我的想法是这样做:

public class UserController : BaseApiController
{
    public IQueryable<ApiUser> Get()
    {
        return _db.Users.AsQueryable<ApiUser>(); 
    }
}

不幸的是,这不起作用我得到以下异常:

[InvalidOperationException: The type Repository.User was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.]
   Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterDelegatingEnumerable1.Write2_ApiUser(String n, String ns, ApiUser o, Boolean isNullable, Boolean needType) +171
   Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterDelegatingEnumerable1.Write3_ArrayOfApiUser(Object o) +297

你知道我怎样才能达到我所需要的吗?

4

1 回答 1

1

您可以使用投影:

public IQueryable<ApiUser> Get()
{
    return _db.Users.Select(u => new ApiUser
    {
        Name = u.Name,
        PhoneNumber = u.PhoneNumber,
        Address = u.Address
    });
}

并且不要衍生UserApiUser或相反。

然后,您可以添加 - 例如 -Where对查询的扩展:

ApiUser apiUser = Get().Where(au => au.Name == "John Doe").SingleOrDefault();
于 2012-10-28T22:53:50.310 回答