0

MVC4 とエンティティ フレームワークを使用しています。ApiController に UserController を呼び出して、プロパティに基づいてユーザーにクエリを実行したいと考えています。私の User エンティティには、名前、電話番号、住所 (複合型) などのプロパティがあり、このデータに基づいてユーザーを照会および取得できるはずです。しかし、ユーザーには、表示したくないパスワード、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
    });
}

Userから派生しApiUserたり、その逆を行ったりしないでください。

次に、たとえばWhere、拡張機能をクエリに追加できます。

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