2016-12-03 13 views
1

私のプロジェクトでは、多くのエンティティで使用されているGenericImageViewModelがあります。 ASPのユーザエンティティを取得するLINQからの暗黙のViewModel生成?

例:

var query = UserRepository.Get(Id).Select(a => new TRDIdenityViewModel 
      { 
       FirstName = a.UserProfile.FirstName, 
       LastName = a.UserProfile.LastName, 
       NickName = a.UserProfile.NickName, 
       ProfileImage = a.UserProfile.ProfileImage 
      }); 

ProfileImageはGenericImageViewModelで、次のように暗黙の演算子を持っています

public static implicit operator TRDGenericImageViewModel(TRDImage image) 
    { 
     return new TRDGenericImageViewModel 
     { 
      Id = image.Id, 
      AspectRatio = image.Ratio, 
      Url = image.Url, 
     }; 
    } 

私はEntity Frameworkの例外をスロークエリを実行する場合:

"'TRDImage'タイプを 'TRDGenericImageViewModel'にキャストできませんLINQ to Entitiesはca EDMプリミティブ型または列挙型を指しています。

私はそれぞれのViewModelすべてがうまく動作しているため、手動でGenericImageViewModelを作成する場合:

var query = UserRepository.Get(Id).Select(a => new TRDIdenityViewModel 
      { 
       FirstName = a.UserProfile.FirstName, 
       LastName = a.UserProfile.LastName, 
       NickName = a.UserProfile.NickName, 
       ProfileImage = new TRDGenericImageViewModel { 
        Id = a.UserProfile.ProfileImage.Id, 
        AspectRatio = a.UserProfile.ProfileImage.Ratio, 
        Url = a.UserProfile.ProfileImage.Url, 
       }, 
      }); 

をしかし、この場合には、私はそれが行くべき道を、すべてのViewModelにTRDGenericImageViewModel世代をコピー&ペーストする必要はないthatsの。何かが変更された場合は、関連するすべてのクラスを変更する必要があります。

この例外を回避する方法はありますか?

+1

これを回避するには、カスタムViewModelクラスインスタンスを作成するラムダの前に '.AsEnumerable()'を使用します。 – Dai

+0

'.AsEnumerable()'を使う前に、lambdaはデータベースから実体を取り出します。したがって、基本クエリーに含まれていない関連エンティティに対して 'Count() 'することはできません。 – creality

+0

あなたの投稿は「Count」の呼び出しを示していません – Dai

答えて

0

.AsEnumerable()を使用すると、以前のラムダを使用することができません。

var query = UserRepository 
      .Get(Id) 
      .AsEnumerable() 
      .Select(a => new TRDIdenityViewModel 
      { 
       FirstName = a.UserProfile.FirstName, 
       LastName = a.UserProfile.LastName, 
       NickName = a.UserProfile.NickName, 
       ProfileImage = new TRDGenericImageViewModel 
       { 
        Id = a.UserProfile.ProfileImage.Id, 
        AspectRatio = a.UserProfile.ProfileImage.Ratio, 
        Url = a.UserProfile.ProfileImage.Url, 
       }, 
       Statistics = new TRDUserStatisticsViewModel 
       { 
        PostCount = a.Posts.Count(), 
        CommentCount = a.Comments.Count(), 
        ImageCount = a.Images.Count(), 
        VideoCount = a.Videos.Count(), 
        VoteCount = a.PostVotes.Count(), 
       } 
      }); 

INCLUDE文でインクルード.AsEnumerable()エンティティのみを呼び出す

がカウントされます。しかし、ユーザーが1000件以上の投稿と10.000件の投票を持つ場合、クエリはデータの悪夢となります。

+0

リポジトリパターンを省略し、EFエンティティオブジェクトを直接使用することをお勧めします。 – Dai

関連する問題