2013-05-07 101 views
1

我有以下产品型号:返回模型.INCLUDE查看

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;} 
} 

在我的onModel创建上下文中我有

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

在这一点上,我希望能够说:选择用户ID == Comments.UserId,返回项目作为列表中的项目。

我的视图(用剃刀)

@model IEnumerable <project.Models,Item> 

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

任何帮助深表感谢。

如果你需要我澄清任何问题,请询问。

亲切的问候

+0

你的意思是'.Where(c => c.UserId == UserId)'? – 2013-05-07 10:21:13

回答

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()将。

+0

你好Knaģis,我想过滤结果。我不确定如何将结果返回给用户。我收到“传入字典的模型项目类型为'System.Data.Infrastructure.DbQuery'1 [<> f_AnonymousType5'2'.....字典需要类型为”System.Collections.Generic.IEnumerable “1 [project.Models.Comment]”。感谢您的帮助 – James 2013-05-07 10:53:47