.NET -投影和动态返回类型不匹配?

muk1a3rh  于 2023-02-01  发布在  .NET
关注(0)|答案(2)|浏览(106)

所以我有这个方法:

public async Task<List<dynamic>> GetIdsOfPersoane()
    {
        return await GetRecords(true).Select(p => new {p.Id, p.Nume}).ToListAsync();
    }

GetRecords从数据库中检索一些数据。
基本上,我想使用投影,但我不想只为这个方法创建一个新对象,所以我做了研究,我应该返回dynamic,我认为这肯定会对object起作用,但我想避免装箱和取消装箱。
问题是我得到了一个错误。

Cannot convert expression type 'System.Collections.Generic.List<{int Id, string Nume}>' to return type 'System.Collections.Generic.List<dynamic>

为什么会这样?动力不应该这样吗?
谢谢。

xqnpmsa8

xqnpmsa81#

要使此函数可编译,可以执行以下操作-为ToListAsync提供泛型类型参数:

async Task<List<dynamic>> GetIdsOfPersoane()
{
    return await GetRecords(true)
        .Select(p => new {p.Id, p.Nume})
        .ToListAsync<dynamic>();
}

或者

async Task<List<dynamic>> GetIdsOfPersoane()
{
    return await GetRecords(true)
        .Select(p => new {p.Id, p.Nume})
        .ToListAsync<object>();
}

你最好做什么-创建一个类型返回(与记录它可以做得很容易):

record PersonIdNume(int Id, string Nume);
async Task<List<PersonIdNume>> GetIdsOfPersoane()
{
    return await GetRecords(true)
       .Select(p => new PersonIdNume(p.Id, p.Nume))
       .ToListAsync();
}
ubof19bj

ubof19bj2#

把对公共方法中返回类型的强类型化的关注放在一边。你可以通过ExpandoObject来解决这个问题。

return (await GetRecords(true)).Select(p =>
{
  dynamic result = new ExpandoObject();  // returns dynamic type
  result.Id = p.Id;
  result.Nume = p.Nume;

  return result;
})

相关问题