1

私は次のアイテムモデルを持っています:

public class Item

 {
   public int Id {get; set;}
   public string name {get; set;}
   public virtual ICollection<Comment> Comments {get; set;}
   public virtual Comment Comment {get; set;}
 }

私は次のユーザーモデルを持っています:

public class User

 {
   public int Id {get; set;}
   public string UserName {get; set;}
   public string email {get; set;}
 }

そして、私は次のコメントモデルを持っています:

public class Comment

 {
   public int Id {get; set;}
   public string text {get; set;}
   public DateTime DateCreated {get; set;}

   public int ItemId {get; set;}
   [ForeignKey("ItemId")]
   public virtual Item Item {get; set;}

   public int UserId {get; set;}
   [ForeignKey("UserId")]
   public virtual User User {get; set;}
 }

私の onModelCreating コンテキストで私は持っています

 modelBuilder.Enitity<Item>().HasOptional(c=>c.Comment).WithMany();

私の目的は、要求しているユーザーのみがコメントしたアイテムをビューに戻すことです。

これまでのところ、私はやっています:

 int UserId = db.Users.Where(u=>u.UserName.Equals(User.Identity.Name))
 .Select(u=>u.Id).FirstOrDefault();


 var itemsWithComments = db.Items.Include(c=>c.Comments).......

この時点で、次のように言いたいと思います: UserId == Comments.UserId のアイテムを選択し、アイテムをリストとして返します。

そして私のビュー(Razorを使用)

 @model IEnumerable <project.Models,Item>

 @foreach (var item in Model)
 .....
 .....

どんな助けでも大歓迎です。

ポイントを明確にする必要がある場合は、お尋ねください。

敬具

4

1 に答える 1

0

特定のユーザーからのコメントのみをフィルタリングしたい場合、使用することはできませんInclude()が、プロジェクションを使用してフィルタリングされたリストを選択することはできます。

var itemsWithComments = db.Items.Select(o => new
{
    Item = o,
    Comments = o.Comments.Where(c => c.UserId == userId)
});

ユーザーがアイテム自体に関連付けられている場合、クエリは単純です。

var itemsWithComments = db.Items.Include(o => o.Comments).Where(o => o.UserId == userId);

覚えておくべきことの1つは、呼び出しSelect()はほとんどの場合Include()、それ以前の呼び出しをリセットするためquery.Include().Select()、含まれている間は含まれませんquery.Select().Include()

于 2013-05-07T10:23:29.993 に答える