【问题标题】:Converting from IQueryable to IEnumerable从 IQueryable 转换为 IEnumerable
【发布时间】:2017-02-28 10:54:50
【问题描述】:

如何从IQueryable 转换为IEnumerable?我看了另一篇帖子Get from IQueryable to IEnumerable,但它不够通用,无法重用?谁能提供一个通用的可重用方法来做到这一点?

public class SoftwareProductRepository
{
    BitDatabaseEntities bitDB = new BitDatabaseEntities();
    public IEnumerable<BuildMetrics> GetBuildMetrics()
    {

        var list = (from r in bitDB.bit_sanity_results select r);

        return list;
    }
}

错误信息:

不能隐式转换类型 'System.Linq.IQueryable&lt;Dashboard.EntityFramework.bit_sanity_results&gt;''System.Collections.IEnumerable&lt;Dashboard.Model.ApiModels.BuildMetrics&gt;'.An 存在显式转换(您是否缺少演员表?)

【问题讨论】:

  • 你检查过这个帖子吗:stackoverflow.com/questions/14842176/…
  • 试试.ToEnumerable()
  • VillateIdiot - 到底在哪里?
  • 只是附注 - 你知道BitDatabaseEntitiesIDisposable,因此你也需要将SoftwareProductRepository 设置为IDisposable 吗?

标签: c#


【解决方案1】:

尝试使用以下方法将可查询转换为可枚举:

(from r in bitDB.bit_sanity_results select r).AsEnumerable();

这将为您提供一个可枚举的集合,但我认为您可能必须从 bit_sanity_results 生成 BuildMetrics 对象,这些对象由此返回。喜欢:

(from r in bitDB.bit_sanity_results select new BuildMetrics{
       <some BuildMetrics property>=r.<some bit_sanity_results property>
        }).AsEnumerable();

示例

public class ReturnClass
{
    public string SSId{get;set;}
    public string Name{get;set;}
}

我们从中选择的表:

table values_store
(
    ss_id varchar(50),
    user_name varchar(250)
)

public class ReturnValuesRepository
{
    public IEnumerable<ReturnClass> GetReturnClasses()
    {   
        //As commented by @Enigmativity if your `BitDatabaseEntities` is `IDisposable` (sure if it inherits from `DbContext`) you should wrap it in a `using` block
        using(var db = new ValuesEntities())
        {
            var list = (from r in db.values_store select new 
                   ReturnClass
                     {
                         SSId=r.ss_id,
                         Name=r.user_name
                    }).AsEnumerable();

            return list;
        }
    }
}

【讨论】:

  • 这会引发错误`“无法将类型'System.Collections.Generic.List'.存在显式转换`
  • 我不知道bit_sanity_resultsBuildMetrics 类中有哪些属性。但是你会得到一个想法,你需要在select 语句中创建对象。
  • @TheVillageIdiot - 您不能将 var 作为类级变量声明。
  • @TheVillageIdiot 也没有必要在任何地方使用.AsEnumerable(),因为IQueryable 已经实现了它。
  • Enigmativity - 你能更清楚地说明你的评论吗?@TheVillageIdiot - 你关注 Enigmativity 的评论吗?
【解决方案2】:

这种情况下的转换实际上应该是隐式的IQueryable&lt;T&gt; implements IEnumerable&lt;T&gt;

您的问题是类型不匹配,因为您正在获取 IQueryable&lt;bit_sanity_results&gt; 但正在尝试返回 IEnumerable&lt;BuildMetrics&gt;

您需要将IQueryable&lt;bit_sanity_results&gt; 投影到IEnumerable&lt;BuildMetrics&gt;

类似这样的:

public class SoftwareProductRepository
{
    BitDatabaseEntities bitDB = new BitDatabaseEntities();
    public IEnumerable<BuildMetrics> GetBuildMetrics()
    {
        return bitDB.bit_sanity_results.Select(r => new BuildMetrics(...));
    }
}

【讨论】:

  • 这会引发错误“无法将类型 'System.Collections.Generic.List'.存在显式转换
  • @user3508811 所以你没有完全使用这个例子。这是做你想做的事情的正确方法。如果你正在做类似List&lt;BuildMetrics&gt; myList = GetBuildMetrics() 的事情,它会抛出你说的错误。
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多