2012-10-28 2 views
0

MVC4와 엔터티 프레임 워크를 사용하고 있습니다. UserController라는 ApiController를 사용하여 사용자의 속성을 기반으로 사용자를 쿼리하고 싶습니다. 내 사용자 엔티티는 이름, 전화 번호, 주소 (복합 유형)와 같은 속성을 가지고 있으며이 데이터를 기반으로 사용자를 쿼리하고 검색 할 수 있어야합니다. 그러나 사용자는 암호, lastsync 등과 같은 속성을 가지고있어서 표시하고 싶지 않습니다. 현재 솔루션이 없습니다. 다음은 나에게 사용자를 제공하지만 모든 엔티티와 함께 ​​표시하고 싶지 않은 사용자도 제공합니다. MVC4 API 컨트롤러에서 Asberyable <EntityBase>을 DbSet <Entity>으로 어떻게 반환 할 수 있습니까?

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

은 내가 ApiUser 클래스에 모든 "공개적으로"눈에 보이는 속성을 이동하고 사용자가 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 

당신은 내가 필요한 것을 달성 할 수있는 방법을 알고 있나요 :

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

이 불행하게도 나는 다음과 같은 예외가 작동하지 않는 이유는 무엇입니까?

답변

1

당신은 프로젝션 사용할 수 있습니다

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

을 그리고 ApiUser 또는 다른 방법으로 주위에서 User을 유도하지 않습니다. 예를 들어 - -

그런 다음 추가 할 수 있습니다 Where 확장을 쿼리에 :

ApiUser apiUser = Get().Where(au => au.Name == "John Doe").SingleOrDefault(); 
관련 문제