无法隐式将类型'System.Linq.IQueryable'转换为'System.Collections.Generic.IList'

35

我有一个方法:

public DzieckoAndOpiekunCollection GetChildAndOpiekunByFirstnameLastname(string firstname, string lastname)
{
    DataTransfer.ChargeInSchoolEntities db = new DataTransfer.ChargeInSchoolEntities();
    DzieckoAndOpiekunCollection result = new DzieckoAndOpiekunCollection();
    if (firstname == null && lastname != null)
    {
        IList<DzieckoAndOpiekun> resultV = from p in db.Dziecko
                      where lastname == p.Nazwisko
                      **select** new DzieckoAndOpiekun(
                     p.Imie,
                     p.Nazwisko,
                     p.Opiekun.Imie,
                     p.Opiekun.Nazwisko)
                  ;
        result.AddRange(resultV);
    }
    return result;
}

在选定的位置出现错误:

错误1 无法隐式将类型“System.Linq.IQueryable<WcfService1.DzieckoAndOpiekun>”转换为“System.Collections.Generic.IList<WcfService1.DzieckoAndOpiekun>”。存在显式转换(是否缺少强制转换?)

有什么解决方法吗?


7个回答

54

要将 IQueryableIEnumerable 转换为列表,可以执行以下操作之一:

IQueryable<object> q = ...;
List<object> l = q.ToList();
或:
IQueryable<object> q = ...;
List<object> l = new List<object>(q);

当然,在这种情况下也可以使用.ToArray() Linq扩展(因为T []也是IList <T>)。 但是,AddRange方法实际上需要什么? 也许他可以只使用var(这意味着在这里是IQueryable <DzieckoAndOpiekun>),并且AddRange会对此感到高兴? 注意:IQueryable <>继承了IEnumerable <> - Jeppe Stig Nielsen

11

您可以使用var resultV替换IList<DzieckoAndOpiekun> resultV


3
这个回答比其他回答要好得多,特别是如果 AddRange() 方法接受一个 IEnumerable<T> 参数的话(它几乎肯定会接受这样的参数...) - Dean Harding
完美,超级简单。谢谢! - Jed Grant

6
如果使用where子句,请确保包含`.First()`,如果不想要IQueryable对象。

谢谢,这对我遇到的类似问题有所帮助。 - mgrenier
或者.FirstOrDefault() - SendETHToThisAddress

4
尝试这个 ->
 new DzieckoAndOpiekun(
                         p.Imie,
                         p.Nazwisko,
                         p.Opiekun.Imie,
                         p.Opiekun.Nazwisko).ToList()

如果我使用.Take(2),.ToList()仍然可以正常工作吗?它会抛出相同的错误。 - manny

2

在linq查询之后,您可以使用.ToList()方法将返回的IQueryable结果转换为IList,如下所示。

您可以使用.ToList()方法将IQueryable类型转换为IList类型。
   public DzieckoAndOpiekunCollection GetChildAndOpiekunByFirstnameLastname(string firstname, string lastname)
{
    DataTransfer.ChargeInSchoolEntities db = new DataTransfer.ChargeInSchoolEntities();
    DzieckoAndOpiekunCollection result = new DzieckoAndOpiekunCollection();
    if (firstname == null && lastname != null)
    {
        IList<DzieckoAndOpiekun> resultV = from p in db.Dziecko
                      where lastname == p.Nazwisko
                      **select** new DzieckoAndOpiekun(
                     p.Imie,
                     p.Nazwisko,
                     p.Opiekun.Imie,
                     p.Opiekun.Nazwisko).ToList()
                  ;
        result.AddRange(resultV);
    }
    return result;
}

我遇到了一个错误:错误1:'WcfService1.DzieckoAndOpiekun'不包含定义为'ToList'的方法,也没有接受类型为'WcfService1.DzieckoAndOpiekun'的第一个参数的扩展方法'ToList'(您是否缺少使用指令或程序集引用?) - netmajor

1

我用EF在从数据库中获取的记录列表上这样解决了我的问题。

ListOfObjectToBeOrder.OrderBy(x => x.columnName).ToList();

1

SonarQube 报告了 返回空集合而不是 null。 我在这个问题的标题中遇到了一个转换错误的问题。我只需要在一个带有 IQueryable 的方法中使用 return XYZ.ToList().AsQueryable(); 就能解决这两个问题:

public IQueryable<SomeType> MethodName (...) {
  IQueryable<SomeType> XYZ;
  ...
  return XYZ.ToList().AsQueryable();
}

希望这对于处于类似情况的人有所帮助。


1
这是一种不同的情况。几乎完全相反。此外,这看起来更像是糟糕的设计。从方法返回IQueryable通常是为了让用户在结果上进行组合。伪装成IQueryableList更像是一个黑客而不是刻意的设计。 - Gert Arnold
@GertArnold 感谢您的快速反馈,非常感激! - Daniel Danielecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接