0

我有三张桌子,

表格1

 UserId  UserName     ...   
  1      Jhon        ...
  2      Ashley      ...
  3      Alexa       ... 
  4      Krish       ...

表:2

BrandId UserId  BrandName        
 1       1       BMW
 2       1       Citroen
 3       2       Audi
 4       4       Peugeot

表3

CountryId UserId  CountryName        
 1          3       Austria

现在我想要的是,如果用户按 Brands = ["BMW", "Audi"] & Country= ["India","Romania"] 搜索项目,那么它应该显示如下用户结果:

 UserId  UserName     ...   
  1      Jhon        ...
  2      Ashley      ...

或仅按 Country= ["India","Austria"] 搜索项目,则结果应为:

 UserId  UserName     ...   
   3      Alexa       ...

我试过像 C#-LINQ 一样,但我总是得到所有的用户数据。它不是根据给定的品牌或国家输入进行过滤的。因此,如果品牌或国家/地区与数据库数据匹配,它应该提供数据。即使我从 LINQ 部分中删除“into”,它也没有正确给出。我哪里做错了?

 var users = new List<Users>();
 users = _DbContext.Users.Where(x => x.Roles == model.Role).ToList();
 users = (from p in users
                         join b in _DbContext.UserBrands.Where(x => model.arBrands.Contains(x.BrandName)).ToList() on p.UserSequence equals b.UserId into bg
                         join c in _DbContext.UserCountries.Where(x => model.arCountries.Contains(x.CountryName)).ToList() on p.UserSequence equals c.UserId into cg
                         select p).ToList();

还有我的样本有效载荷,

{
 "arBrands": ["Citroen","Peugeot"],
 "arCountries":["India","Romania"],
 "Role":"All Roles"
}

实体:

public class UserBrands
{
    [Key] public virtual int UserBrandsId { get; set; }
    public virtual int UserId { get; set; }
    public virtual int BrandId { get; set; }
    public virtual string BrandName { get; set; }
}

public class UserCountries
{
    [Key] public virtual int UserCountriesId { get; set; }
    public virtual int UserId { get; set; }
    public virtual int CountryId { get; set; }
    public virtual string CountryName { get; set; }
}

public class UsersModel
{
    public string[] arCountries { get; set; }
    public string[] arBrands { get; set; }
    [Required]
    public string Role { get; set; }
    public List<LeafLet> features { get; set; }
}

public class Users : BaseEntity
{
    [Key]
    public virtual int UserSequence { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Countries { get; set; }
    public virtual string Brands { get; set; }
    public virtual string Email { get; set; }
    public virtual string Latitude { get; set; }
    public virtual string Longitude { get; set; }
    public virtual string ProjectRole { get; set; }
    public virtual string Roles { get; set; }
}
4

1 回答 1

1

您需要稍微清理一下模型,并添加导航属性以让 EF 为您执行连接。

    public class Users
    {
        [Key]
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }
        public string Role { get; set; }

        //Only use the virtual keyword for navigating properties to other entities.
        public virtual IEnumerable<UserBrand> UserBrands {get; set;}
        public virtual IEnumerable<UserCountry> UserCountries {get; set;}
    }

    public class UserBrand
    {
        [Key] 
        public int Id { get; set; }
        public int UserId { get; set; }
        public int BrandId { get; set; }

        [ForeignKey("UserId")] // lets Entity Framework know how to map the navigation.
        public virtual User User { get; set; }

        [ForeignKey("BrandId")]
        public virtual Brand Brand { get; set; }
    }


    public class Brand
    {   
        [Key]
        public int Id { get; set; }  
        public string BrandName { get; set; }
    }


    public class UserCountry
    {
        [Key] 
        public int Id { get; set; }
        public int UserId { get; set; }
        public int CountryId { get; set; }

        [ForeignKey("UserId")]
        public virtual User User { get; set; }

        [ForeignKey("CountryId")]
        public virtual Country Country { get; set; }
    }

    public class Country
    {
        [Key] 
        public int Id { get; set; }
        public string CountryName { get; set; }
    }

然后,您的 LINQ 查询将如下所示:

 var users = _DbContext.Users
                 .Where(u => u.Role == model.Role)
                 .Select(u => new { 
                      UserName = u.UserName,
                      Email = u.Email,
                      Role = u.Role,
                      BrandNames = u.UserBrands.Select(ub => ub.Brand.BrandName),
                      Countries = u.UserCountries.Select(uc => uc.CountryName)
                  }).ToList();

您可以使用导航属性向 Where 子句添加更多过滤器:

 var users = _DbContext.Users
                 .Where(u => u.Role == model.Role 
                       && u.UserBrands.Any(ub => 
                              ub.Brand.BrandName == "Brand X") //Filter for brand name.
                       && u.UserCountries.Any(uc => 
                              uc.Country.CountryName == "United States") //Filter for brand name.

                 .Select(u => new { 
                      UserName = u.UserName,
                      Email = u.Email,
                      Role = u.Role,
                      BrandNames = u.BrandNames,
                      Countries = u.Countries
                           })
                 .ToList();
于 2020-05-31T08:59:54.463 回答