简体   繁体   English

从IQueryable转换为IEnumerable

[英]Converting from IQueryable to IEnumerable

How do I convert from IQueryable to IEnumerable ? 如何将IQueryable转换为IEnumerable I looked at another post Get from IQueryable to IEnumerable but it's not generic enough to reuse? 我看了另一篇文章《从IQueryable到IEnumerable》,但它不够通用,无法重用吗? Can anyone provides a generic reusable way to do this? 谁能提供一种通用的可重用方法来做到这一点?

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

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

        return list;
    }
}

Error message: 错误信息:

Cannot implictly converty type 'System.Linq.IQueryable<Dashboard.EntityFramework.bit_sanity_results>' to 'System.Collections.IEnumerable<Dashboard.Model.ApiModels.BuildMetrics>' .An explicit conversion exists(are you missing a cast?) 无法将类型'System.Linq.IQueryable<Dashboard.EntityFramework.bit_sanity_results>'隐式转换为'System.Collections.IEnumerable<Dashboard.Model.ApiModels.BuildMetrics>' 。存在显式转换(是否缺少转换?)

Try converting queryable to enumerable with this: 尝试使用以下方法将queryable转换为enumerable:

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

This will give you an enumerable collection but I think you may have to generate BuildMetrics objects from bit_sanity_results that are returned by this. 这将为您提供一个可枚举的集合,但我认为您可能必须从bit_sanity_results返回的bit_sanity_results生成BuildMetrics对象。 Like: 喜欢:

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

Example

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

Table from which we select: 我们从中选择的表:

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;
        }
    }
}

The conversion in this case should actually be implicit as IQueryable<T> implements IEnumerable<T> . 这种情况下的转换实际上应该是隐式的,因为IQueryable<T>实现IEnumerable<T>

Your problem here is a type mismatch, as you are getting IQueryable<bit_sanity_results> but are trying to return IEnumerable<BuildMetrics> . 您的问题是类型不匹配,因为您正在获取IQueryable<bit_sanity_results>但正尝试返回IEnumerable<BuildMetrics>

You'd need to project the IQueryable<bit_sanity_results> to IEnumerable<BuildMetrics> . 您需要将IQueryable<bit_sanity_results>IEnumerable<BuildMetrics>

Something like this: 像这样:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM