【问题标题】:ASP.NET MVC query lambda expressionASP.NET MVC 查询 lambda 表达式
【发布时间】:2016-12-23 18:32:21
【问题描述】:

您好,我有一个查询有问题。为什么它总是没有返回值。

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; }
}

我做错了什么?

【问题讨论】:

  • “我想得到在 usrDetails 列表和 result.UserDetailLanguages 中相同的结果。”
  • 例如:我的用户有一些属性,其中之一是语言列表。现在我只想搜索已选择语言的用户。在 usrDetails 我存储选定的语言,现在我想找到使用其中一种语言的用户
  • 这没什么意义,但我注意到“有一种这种语言”。可能想使用=以外的东西@

标签: sql asp.net-mvc linq lambda


【解决方案1】:

如果你想查看你的值是否在一个列表中,你可以使用列表的 Contains 函数——像这样:

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

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

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

【讨论】:

    【解决方案2】:

    看起来您正在检查以下代码中列表之间的相等性

    result = result.Where(x => x.UserDetailLanguages == usrDetails);
    

    这可能不起作用,要检查列表的相等性,您可以使用类似的东西

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-25
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多