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

Posted

技术标签:

【中文标题】在asp.net mvc中从具有多对多关系的数据库中获取记录【英文标题】:Getting records from the database with many to many relationship in asp.net mvc 【发布时间】:2017-01-15 11:20:30 【问题描述】:

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
                             ;

但我的第三个 where 条件不正确,因为 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> UserProfileCategoriesget;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】:

在编写 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 这样的属性名称,因为这些名称表明它们是布尔值。

【讨论】:

以上是关于在asp.net mvc中从具有多对多关系的数据库中获取记录的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 如何使用 ApplicationUser 和其他域类之间的多对多关系

ASP.NET MVC 4、EF 和 LINQ:为多对多关系创建特定的 LINQ 查询

ASP.NET Core MVC:在发布编辑方法之前删除多对多条目

在 ASP.net 中使用多对多关系

如何在 Laravel 中从多对多关系的一对多关系中获取项目?

MVC 多对多仅在代码中首先获取具有某种类型的实体