我有以下项目模型:
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)
.....
.....
非常感谢任何帮助。
如果您需要我澄清任何一点,请询问。
亲切的问候
答案 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}}。