参数类型System.Linq.IQueryable<>不能分配给参数类型Systems.collection.generic.ienumerable

时间:2018-01-20 06:41:21

标签: c# linq

我正在尝试连接表中的两个字段并将其指定为列表。请参阅下面的代码

public List<ForDropDownList> GetAccountsForDownList()
{
    var accountList = new List<ForDropDownList>();

    using (_context = new ApplicationContext())
    {
        accountList.AddRange( _context.Account
                                      .Select(a => new
                                      {
                                          a.AccountId, 
                                          FullName = string.Concat(a.FirstName, a.LastName)
                                      }));
    }

    return accountList;
}

这是我的模特

public class ForDropDownList
{
    public int AccountId { get; set; }
    public string FullName { get; set; }
}

我收到此错误:

  

参数类型System.Linq.IQueryable&lt; {AccountId:int,FullName:string}&gt;不能分配给参数类型Systems.Collection.Generic.IEnumerable

3 个答案:

答案 0 :(得分:1)

您最好使用强类型而不是&#34; new {}&#34;匿名类型。例如:

accountList.AddRange(_context.Account.Select(a => new ForDropDownList { AccountId = a.AccountId, FullName = string.Concat(a.FirstName, a.LastName) }));

C#不能将匿名类型转换为强类型。 FYI。

答案 1 :(得分:1)

您应该如下更改您的预测,并在结尾处致电ToList

_context.Account
        .Select(a => new ForDropDownList
        {
            a.AccountId, 
            FullName = string.Concat(a.FirstName, a.LastName)
        }).ToList()

需要进行这些更改,因为:

  • 如果不指定ForDropDownList投影,我们会创建具有与ForDropDownList相同属性的匿名类型的实例。由于我们投影的对象类型不是ForDropDownList,因此我们将结果集合添加到ForDropDownList个对象的集合中(AddRange ...)
  • 需要ToList()来强制执行查询并将结果存入内存。 AddRange期待一个集合。另一方面,您刚刚定义了查询,但您没有请求执行。因此它不能用作AddRange方法的参数。

答案 2 :(得分:1)

基本上,您的选择会设置一个新的动态对象,然后您无法添加到List<ForDropDownList> 以下代码应该可以工作:

accountList.AddRange(_context.Account.Select(a => new ForDropDownList { AccountId = a.AccountId, FullName = string.Concat(a.FirstName, a.LastName) }));