返回带有.Include的模型进行查看

时间:2013-05-07 10:16:17

标签: c# entity-framework lambda

我有以下项目模型:

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)
 .....
 .....

非常感谢任何帮助。

如果您需要我澄清任何一点,请询问。

亲切的问候

1 个答案:

答案 0 :(得分: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);

要记住的一件事 - 调用Select()几乎总是会重置Include()之前的query.Include().Select()次调用,因此query.Select().Include()将不会包含{{1}}。