【问题标题】:ASP.NET - How can i create List with anonymous typesASP.NET - 我如何创建具有匿名类型的列表
【发布时间】:2020-11-01 23:42:48
【问题描述】:

我想在我的数据库中搜索用户并在 WHERE 语句中创建新类型。 但是当我这样做时,我无法在我的列表中添加范围以进行返回。

我在“AllUsers.AddRange(user);”中收到错误

        var AllUsers = new List<string>();
        var url = "https://localhost:44356/";

        string[] namelist = name.Split(" ");

        foreach (var n in namelist)
        {
            var user = await context.Users.Where(r => r.FirstName.ToLower().Contains(n) || r.LastName.ToLower().Contains(n)).Select(
                u => new
                {
                    id = u.Id,
                    Name = u.FirstName + u.LastName,
                    Beschreibung = u.Description,
                    Avatar = url + u.ProfileImagePath.Remove(0, 58),
                    Header = url + u.HeaderImagePath.Remove(0, 58),

                }).ToListAsync();

            AllUsers.AddRange(user);
            
            
        }

        var mitglieder = AllUsers.Distinct().ToList();

        return Ok(mitglieder);

【问题讨论】:

  • 问题是,对象user 是一个dynamic 列表,这意味着您不能将它添加到字符串列表中。要么将其转换为JSON 以使其成为字符串,要么将AllUsers 列表设为dynamic 列表而不是基于string 的列表。

标签: c# asp.net list


【解决方案1】:

那是因为您的实体 userobject,而您正试图将其存储在 strings 的列表中。 您可以创建一个新类UserDto,并存储UserDto 的列表,而不是列表,因为您最终可能会引用 稍后那个匿名对象,userDto 可能有用

//var AllUsers = new List<**string**>(); not this

var AllUsers = new List<UserDto>(); //this 

public class UserDto
{
    public int Id {get; set;}
    public string Name {get; set;}
    public string Beschreibung {get; set;}
    public string Avatar {get; set;}
    public string Header {get; set;}
}

var AllUsers = new List<object>(); //or this

【讨论】:

    【解决方案2】:

    您的变量 AllUsersList&lt;string&gt; 类型,user 是匿名对象类型,无法转换为 string

    如果你想为它使用匿名类型,你可以这样做:

    var AllUsers = Enumerable.Empty<object>().Select(obj => new
    {
        Id = default(int),
        Name = default(string),
        Beschreibung = default(string),
        Avatar = default(string),
        Header = default(string)
    }).ToList();
    

    【讨论】:

      【解决方案3】:

      这个问题可能有多种解决方案,但我建议使用这个:

      使用Select 表达式中所需的所有字段创建一个类

      public class UserViewModel
      {
          public int Id {get; set;}
          public string Name {get; set;}
          public string Beschreibung {get; set;}
          public string Avatar {get; set;}
          public string Header {get; set;}
      }
      

      然后像这样修改你的代码:

      var AllUsers = new List<UserViewModel>();
      var url = "https://localhost:44356/";
      
      string[] namelist = name.Split(" ");
      
      foreach (var n in namelist)
      {
          var user = await context.Users.Where(r => r.FirstName.ToLower().Contains(n) || r.LastName.ToLower().Contains(n))
                 .Select(u => new UserViewModel
                  {
                      Id = u.Id, // if you have a string, then modify the model to support string values
                      Name = u.FirstName + " " + u.LastName, // Added a space in first and last name
                      Beschreibung = u.Description,
                      Avatar = url + u.ProfileImagePath.Remove(0, 58),
                      Header = url + u.HeaderImagePath.Remove(0, 58),
                  }).ToListAsync();
          AllUsers.AddRange(user);
      }
      
      var mitglieder = AllUsers.GroupBy(g => g.Id).Distinct().ToList(); // You need to group the items so you can get the distinct items on the basis of ID.
      
      return Ok(mitglieder);
      

      注意,在Distinct() 方法中,我们已经对元素进行了分组,因此您实际上可以获得不同的元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2012-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多