【问题标题】:Cannot implicitly convert type 'System.Linq.IQueryable' to 'System.Collections.Generic.IList'无法将类型“System.Linq.IQueryable”隐式转换为“System.Collections.Generic.IList”
【发布时间】:2011-03-25 02:06:40
【问题描述】:

我有一个方法:

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”隐式转换为“System.Collections.Generic.IList”。存在显式转换(您是否缺少演员表?)

知道如何解决我的问题吗?

【问题讨论】:

标签: c# .net linq exception-handling linq-to-entities


【解决方案1】:

SonarQube 报告了Return an empty collection instead of null.,我遇到了这个问题标题中的转换错误问题。 我只能在 IQueryable 的方法中使用 return XYZ.ToList().AsQueryable(); 来摆脱这两种情况,如下所示:

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

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

【讨论】:

  • 这是另一种情况。几乎100%相反。此外,这看起来更像是糟糕的设计。从方法中返回IQueryable 通常是为了让用户能够对结果进行撰写。伪装成 IQueryableList 看起来更像是一种黑客行为,而不是经过深思熟虑的设计。
  • @GertArnold 感谢您的快速反馈,非常感谢!
【解决方案2】:

我已经在 EF 中的 db 记录列表中以这种方式解决了我的问题

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

【讨论】:

    【解决方案3】:

    如果使用 where 子句,如果您不想要 IQueryable 对象,请务必包含 .First()

    【讨论】:

    • 感谢这有助于解决我遇到的类似问题
    • .FirstOrDefault()
    【解决方案4】:

    您可以将IList&lt;DzieckoAndOpiekun&gt; resultV 替换为var resultV

    【讨论】:

    • 这是一个比其他答案更好的答案。特别是如果AddRange() 接受IEnumerable&lt;T&gt;(它几乎肯定会......)
    • 完美,超级简单。谢谢!
    【解决方案5】:

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

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

    或:

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

    【讨论】:

    • 当然.ToArray() Linq 扩展也可以在这种情况下使用(因为T[] 也是IList&lt;T&gt;)。但是AddRange 方法实际上需要什么?也许他可以直接使用var(这里的意思是IQueryable&lt;DzieckoAndOpiekun&gt;),而AddRange 会对此感到满意吗?注意:IQueryable&lt;&gt; 继承 IEnumerable&lt;&gt;
    【解决方案6】:

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

       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' 的定义,并且没有扩展方法 'ToList' 接受类型为 'WcfService1.DzieckoAndOpiekun' 的第一个参数(您是否缺少 using 指令或程序集引用?)
    【解决方案7】:

    试试这个 -->

     new DzieckoAndOpiekun(
                             p.Imie,
                             p.Nazwisko,
                             p.Opiekun.Imie,
                             p.Opiekun.Nazwisko).ToList()
    

    【讨论】:

    • .ToList() 将正常工作,如果我使用 .Take(2) 代替。它会抛出同样的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多