【问题标题】:Can't find the right return type for a linq query output找不到 linq 查询输出的正确返回类型
【发布时间】:2021-04-13 14:50:59
【问题描述】:

我有以下方法可以返回 LINQ 查询的输出。该方法工作得很好,但我有动态作为返回类型,因为以下 2 不起作用:List & IEnumerable。 LINQ 查询输出的正确返回类型应该是什么?我的方法:

public dynamic GetUserFollowers(Guid user_gd)
{
   var listOfFollowers = from users in _context.Users
                         from userFollowing in _context.UserFollowings.Where(
                            uf => uf.User2 != users.Gd && uf.User2 == user_gd && uf.User1 == users.Gd
                         )
                         select new { users.Gd, users.Firstname, users.Lastname, users.Username, users.Email };

   return listOfFollowers;
}

用户模型:

public class User
{
    [Key]
    public Guid Gd { get; set; }

    public string Firstname { get; set; }

    public string Lastname { get; set; }

    public string Username { get; set; }

    public string Email { get; set; }

    public byte[] PasswordHash { get; set; }

    public byte[] PasswordSalt { get; set; }
}

使用列表时出错:

不能隐式转换类型'System.Linq.IQueryable>' 到 'System.Collections.Generic.List'。 存在显式转换(您是否缺少演员表?)

使用 IEnumerable 时出错:

不能隐式转换类型'System.Linq.IQueryable>' 到 'System.Collections.Generic.IEnumerable'。 存在显式转换(您是否缺少演员表?)

我们将不胜感激!

【问题讨论】:

    标签: c# linq asp.net-web-api


    【解决方案1】:

    当前代码的返回值在错误信息中:

    IQueryable<<anonymous type: System.Guid Gd, string Firstname, string Lastname, string Username, string Email>>
    

    改变这一行

    select new { users.Gd, users.Firstname, users.Lastname, users.Username, users.Email };
    

    这个

    select new User() { Gd = users.Gd, Firstname = users.Firstname, Lastname = users.Lasname, Username = users.Username };
    

    然后您可以将dynamic 更改为IEnumerable&lt;User&gt;

    如果要将返回类型更改为List&lt;User&gt;,请添加ToList(),正如@juharr 在cmets 中所说。

    【讨论】:

    • 他们必须执行ToList 才能使用List&lt;User&gt; 返回类型。
    • @juharr 对,感谢您指出这一点,将编辑答案:)
    • 哇没想到!感谢您的帮助,我很感激!
    • 很高兴能提供帮助:)
    【解决方案2】:

    另一种选择是创建一个仅包含您要公开的属性的新类。 例如

    public class UserDto
    {
        public Guid Gd { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public string Username { get; set; }
        public string Email { get; set; }
    }
    

    然后在查询中使用它

    select new UserDto
    {
        Gd = users.Gd,
        Firstname = users.Firstname,
        Lastname = users.Lastname,
        Username = users.Username,
        Email = users.Email
    };
    

    并使用.AsEnumerable().ToList() 获得IEnumerable&lt;UserDto&gt;List&lt;UserDto&gt; 的返回类型。

    return listOfFollowers.ToList(); // or .AsEnumerable()
    

    【讨论】:

    • 没错!完全忘记了重要的 DTO。感谢您的帮助,我会将其添加到我的代码中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多