找不到 linq 查询输出的正确返回类型

Posted

技术标签:

【中文标题】找不到 linq 查询输出的正确返回类型【英文标题】:Can't find the right return type for a linq query output 【发布时间】: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'。 存在显式转换(您是否缺少演员表?)

我们将不胜感激!

【问题讨论】:

【参考方案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。感谢您的帮助,我会将其添加到我的代码中。

以上是关于找不到 linq 查询输出的正确返回类型的主要内容,如果未能解决你的问题,请参考以下文章

如果linq查询找不到匹配的记录,则对象引用未设置错误? [重复]

并且找不到可接受类型为“System.Linq.IQueryable<MvcApplication1.Models.Student>”

结果为空时LINQ返回啥

LINQ更新:找不到行或行已更改

存储函数错误:找不到能够从类型转换的转换器

Python 子进程调用返回“找不到命令”,终端正确执行