在asp.net mvc中从数据库获取具有多对多关系的记录

时间:2017-01-15 11:20:31

标签: c# asp.net-mvc linq junction-table

This is the structure of the database on which i am working.Click on this text.

我想选择属于特定CategoryID的用户的EmailID 在MailStatusTable中提到MailStatus列包含False。

这是我到目前为止的查询:

var category = from m in mcontext.MailStatusTable
                             where m.MailStatus == false
                             select new
                             {
                                 CategoryID = m.CategoryID
                             };
            var email_list = from u in mcontext.UserProfiles
                             where u.AnExpert == true
                             where u.AnInstitute == true
                             where category.Contains(u.UserProfileID)

                             select new
                             {
                                 LastName = u.LastName,
                                 EmailU = u.Email
                             };

但我的第三个条件不正确,因为UserProfiles表和类别表都通过第三个表连接,并且该表没有模型类,因为其中的列都是外键。

这是我在上下文类中定义的关系:

modelBuilder.Entity<Categories>()
            .HasMany(c => c.CategoriesUserProfile).WithMany(x => x.UserProfileCategories).Map(q => q.MapLeftKey("CategoryID").MapRightKey("UserProfileID").ToTable("UserProfileCategories"));

如何选择属于特定类别的用户的EmailID。

提前致谢。 当然, 这些是我的模特:

public class UserProfiles
{
    public int UserProfileID { get; set; }
    public string LastName { get; set; }
    public bool AnExpert { get; set; }
    public bool AnInstitute { get; set; }
    public bool Client { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Categories> UserProfileCategories{get;set;}
}
public class Categories
{
    public int CategoryID { get; set; }
    public String Name { get; set; }
    public virtual ICollection<UserProfiles> CategoriesUserProfile { get; set; }
    public virtual ICollection<MailStatusTables> CategoriesMailStatusTable { get; set; }

}
public class MailStatusTables
{
    public int MailStatusID { get; set; }
    public bool MailStatus { get; set; }
    public int EnquiryID { get; set; }
    public int CategoryID { get; set; }
    public virtual Categories MailStatusCategory { get; set; }

}

1 个答案:

答案 0 :(得分:0)

编写LINQ查询时,大多数情况下,最好从希望查询返回的实体(或包含要返回的属性的实体)开始。因此,在这种情况下,UserProfile

var email_list = from u in mcontext.UserProfiles
                 where u.AnExpert
                    && u.AnInstitute
                    && u.UserProfileCategories
                        .Any(c => c.MailStatusTables
                                   .Any(ms => !ms.MailStatus))
                 select new
                 {
                     LastName = u.LastName,
                     EmailU = u.Email
                 };

这将返回至少有一个类别包含至少一个非邮件状态的用户的所有用户数据。

顺便说一下,我更喜欢IsExpertHasMailStatus等属性名称,因为这些名称表示它们是布尔值。