Users
のコレクションを持っているSites
のセットがあります。たとえば、最後に訪問したUser
を特定のsite
にするためにクエリを再定義する必要があるときはいつでも、自分自身がDRYプリンシパルに違反していることがわかります。一般的なクエリでエンティティモデルを拡張することは可能ですか?
例えば、私のクエリは次のようになります。
from site in Context.Sites
where site.ID == 99
select new {
ID = site.ID,
Name = site.Name,
URL = site.URL,
LastVisitedUser = site.Users.OrderByDescending(u => u.LastVisited).Select(u => new {
ID = u.ID,
Username = u.Username,
Email = u.EmailAddress
})
.FirstOrDefault()
}
そのクエリは、私が欲しいものを返しますが、私は私がでサイトを選択していて自分が複数の場所でLastVisitedUserため、これと同じ選択を繰り返し見つけます私のさまざまなViewModelを取り込むさまざまな方法。
だから、私は単純にそうような財産と私のサイトEntitiyクラスを拡張することを考えた:
public partial class Site {
public LastVisitedUser {
get {
var query = from user in Users
where user.SiteID == this.ID
orderby user.LastVisited descending
select user;
return query.FirstOrDefault()
}
}
}
このように、私は、サイトを選択していたときに、この特性をつかむために、かなり些細なことでしょう。このはほぼですが、User
をViewModelのバージョンに投影する方法について明白な方法がなく、私の戻り値のLastVisitedプロパティにUserViewModelプロパティにEntityユーザーを割り当てようとしています。
おそらく例が説明するのに役立ちます。私が達成しようとしているのは次のようなものです:
from site in Context.Sites
where site.ID == 99
select new SiteViewModel {
ID = site.ID,
Name = site.Name,
URL = site.URL,
LastVisitedUser = site.LastVisitedUser <--- NOTE
}
注:これは私の失敗のポイントです。 LastVisitedUser
は、サブモデルがUser
のViewModelです。
私は正しい方法でこれについてお伝えしますか?私がしようとしていることを達成することはできますか?それとも、私は恐ろしく間違っていますか?私はこの問題を怒らせて、他の人にぶつかるつもりですか?
ありがとうございます!
これらのメソッドはコントローラから呼び出されますか、これらのクエリにこれらのクエリが必要ですか? – RoelF
私のリポジトリにあります。私のコントローラは、IEnumerableのバリアントまたは具体的なオブジェクトを扱っています。 – BradBrening