2016-12-23 58 views
-1

你好,我在一个查询中有问题。为什么它总是没有价值。ASP.NET MVC查询lambda表达式

public List<UserDetail> userSearchModel(UserSearchModel searchModel) 
    { 
     string userid = User.Identity.GetUserId(); 
     var user = _dbContext.UserDetails.Where(x => x.Id == userid); 
     var result = _dbContext.UserDetails.Except(user).ToList().AsQueryable();   
     if (searchModel != null) 
     { 
      if (searchModel.LanguageId.Count() != 0) 
      { 
       List<UserDetailLanguage> usrDetails = new List<UserDetailLanguage>(); 
       foreach (var item in searchModel.LanguageId) 
       { 
        var details = _dbContext.UserDetailLanguages.Where(x => x.LanguageId == item).ToList(); 
        foreach (var item2 in details) 
        { 
         usrDetails.Add(item2); 
        } 
       }    
       result = result.Where(x => x.UserDetailLanguages == usrDetails); 
      } 
     }   
     return result.ToList(); 
    } 

我想要得到的结果,其在usrDetails列表和result.UserDetailLanguages相同。 在result.UserDetailLanguages我有记录等于记录在usrDetails,但这不想检索。

这里是我的模型:

public class UserDetail 
{ 
    public UserDetail() 
    { 
     this.UserDetailLanguages = new HashSet<UserDetailLanguage>(); 
    } 
    [Key, ForeignKey("User")] 
    public string Id { get; set; } 
    public DateTime Birthday { get; set; } 
    public string Sex { get; set; } 
    public string Country { get; set; } 
    public string About { get; set; } 
    [NotMapped] 
    public int Age { get { return DateTime.Now.Year - Birthday.Year; } } 
    public virtual ApplicationUser User { get; set; } 
    public virtual ICollection<UserDetailLanguage> UserDetailLanguages { get; set; } 

} 
public class UserDetailLanguage 
{ 
    public Int32 Id { get; set; } 

    public virtual UserDetail UserDetail { get; set; } 
    public string UserDetailId { get; set; } 
    public virtual Language Language { get; set; } 
    public Int32 LanguageId { get; set; } 
    public Boolean IsKnown { get; set; } 
    public static implicit operator List<object>(UserDetailLanguage v) 
    { 
     throw new NotImplementedException(); 
    } 
} 
public class Language 
{ 
    public Language() 
    { 
     this.UserDetailLanguages = new HashSet<UserDetailLanguage>(); 
    } 
    public int Id { get; set; } 
    public string Value { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<UserDetailLanguage> UserDetailLanguages { get; set; } 
} 

我做错了吗?

+0

*“我想要得到的结果,其在usrDetails列表和result.UserDetailLanguages一样的。” * <==这使得没有意义。你将不得不更好地解释或给我们一个例子。 – Hogan

+0

例如:我有拥有一些属性的用户,其中之一是语言列表。现在我只想搜索已选择语言的用户。在usrDetails我存储选定的语言,现在我想找到这种用户有这种语言之一 – dmbb

+0

这没有什么意义,但我注意到这个“有** **这种语言”。可能要使用'='以外的东西 – Hogan

回答

1

如果你想看看你的价值是在您使用包含列表的功能列表 - 像这样:

result = result.Where(x => usrDetails.Contains(x.UserDetailLanguage)); 

如果你想看看是否有两个列表中的任何项目,你可以使用交集这样的:

result = result.Where(x => usrDetails.Intersect(x.UserDetailLanguage).Count() > 0); 
+0

谢谢,Intersect对我来说工作正常。 – dmbb

0

看起来你是在下面的代码

result = result.Where(x => x.UserDetailLanguages == usrDetails); 
检查列表之间的平等

这可能无法正常工作,检查列表平等,你可以使用类似

Enumerable.SequenceEqual(FirstList.OrderBy(fList => fList), 
        SecondList.OrderBy(sList => sList))