C# 从IQueryable转换为IEnumerable

C# 从IQueryable转换为IEnumerable,c#,C#,如何从IQueryable转换为IEnumerable?我看了另一篇文章,但它不够通用,不能重复使用?有人能提供一种通用的可重用方法来实现这一点吗 public class SoftwareProductRepository { BitDatabaseEntities bitDB = new BitDatabaseEntities(); public IEnumerable<BuildMetrics> GetBuildMetrics() {

如何从
IQueryable
转换为
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;
    }
}
公共类SoftwareProductRepository
{
BitDatabaseEntities bitDB=新的BitDatabaseEntities();
公共IEnumerable GetBuildMetrics()
{
var list=(从bitDB.bit_健全性_结果中的r选择r);
退货清单;
}
}
错误消息:

无法隐式转换类型
“System.Linq.IQueryable”
'System.Collections.IEnumerable'
.An 存在显式转换(是否缺少强制转换?)


这种情况下的转换实际上应该是隐式的

这里的问题是类型不匹配,因为您得到的是
IQueryable
,但试图返回
IEnumerable

您需要将
IQueryable
投影到
IEnumerable

大概是这样的:

public class SoftwareProductRepository
{
    BitDatabaseEntities bitDB = new BitDatabaseEntities();
    public IEnumerable<BuildMetrics> GetBuildMetrics()
    {
        return bitDB.bit_sanity_results.Select(r => new BuildMetrics(...));
    }
}
公共类SoftwareProductRepository
{
BitDatabaseEntities bitDB=新的BitDatabaseEntities();
公共IEnumerable GetBuildMetrics()
{
返回bitDB.bit_sanity_结果。选择(r=>newbuildmetrics(…);
}
}

这种情况下的转换实际上应该是隐式的

这里的问题是类型不匹配,因为您得到的是
IQueryable
,但试图返回
IEnumerable

您需要将
IQueryable
投影到
IEnumerable

大概是这样的:

public class SoftwareProductRepository
{
    BitDatabaseEntities bitDB = new BitDatabaseEntities();
    public IEnumerable<BuildMetrics> GetBuildMetrics()
    {
        return bitDB.bit_sanity_results.Select(r => new BuildMetrics(...));
    }
}
公共类SoftwareProductRepository
{
BitDatabaseEntities bitDB=新的BitDatabaseEntities();
公共IEnumerable GetBuildMetrics()
{
返回bitDB.bit_sanity_结果。选择(r=>newbuildmetrics(…);
}
}

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

(from r in bitDB.bit_sanity_results select r).AsEnumerable();
这将为您提供一个可枚举的集合,但我认为您可能必须从该集合返回的
bit\u sanity\u结果生成
BuildMetrics
对象。比如:

(from r in bitDB.bit_sanity_results select new BuildMetrics{
       <some BuildMetrics property>=r.<some bit_sanity_results property>
        }).AsEnumerable();
我们从中选择的表格:

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;
        }
    }
}
表值\u存储
(
ss_id varchar(50),
用户名varchar(250)
)
公共类返回值存储
{
公共IEnumerable GetReturnClasses()
{   
//正如@Enigmativity所评论的,如果您的“BitDatabaseEntities”是“IDisposable”(当然,如果它继承自“DbContext”),您应该将其包装在“using”块中
使用(var db=new valuesenties())
{
var list=(从db.values\u存储区中的r选择new
返回舱
{
SSId=r.ss_id,
Name=r.user\u Name
}).AsEnumerable();
退货清单;
}
}
}

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

(from r in bitDB.bit_sanity_results select r).AsEnumerable();
这将为您提供一个可枚举的集合,但我认为您可能必须从该集合返回的
bit\u sanity\u结果生成
BuildMetrics
对象。比如:

(from r in bitDB.bit_sanity_results select new BuildMetrics{
       <some BuildMetrics property>=r.<some bit_sanity_results property>
        }).AsEnumerable();
我们从中选择的表格:

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;
        }
    }
}
表值\u存储
(
ss_id varchar(50),
用户名varchar(250)
)
公共类返回值存储
{
公共IEnumerable GetReturnClasses()
{   
//正如@Enigmativity所评论的,如果您的“BitDatabaseEntities”是“IDisposable”(当然,如果它继承自“DbContext”),您应该将其包装在“using”块中
使用(var db=new valuesenties())
{
var list=(从db.values\u存储区中的r选择new
返回舱
{
SSId=r.ss_id,
Name=r.user\u Name
}).AsEnumerable();
退货清单;
}
}
}

你检查过这个线程了吗:试试
.ToEnumerable()
。VillateIdiot-确切位置?只是一个旁注-您知道
BitDatabaseEntities
是一个
IDisposable
,因此您需要使
SoftwareProductRepository
也成为一个
IDisposable
吗?您检查过这个线程了吗:try
.ToEnumerable()
。VillateIdiot-确切位置?只是一个旁注-您知道
BitDatabaseEntities
是一个
IDisposable
,因此您需要将
SoftwareProductRepository
也设置为
IDisposable
吗?这会引发一个错误无法隐式转换类型“System.Collections.Generic”。List@user3508811所以你没有使用这个例子。这是做你想做的事的正确方法。如果您正在执行类似于
List myList=GetBuildMetrics()
的操作,它将抛出您所说的错误。这将抛出一个错误无法隐式转换类型“System.Collections.Generic”。List@user3508811所以你没有使用这个例子。这是做你想做的事的正确方法。如果您正在执行类似于
List myList=GetBuildMetrics()
的操作,它将抛出您所说的错误。这将抛出一个错误`“无法隐式转换类型'System.Collections.Generic.list我不知道
bit\u sanity\u结果
BuildMetrics
类中有哪些属性。但是您会发现,您需要在
select
语句中创建对象。@VillageDiot-您不能将
var
作为类级变量声明。@VillageDiot也不需要在任何地方使用
.AsEnumerable()
,因为
IQueryable
已经实现了它。Enigmativity-你能对你的评论有更多的了解吗?@TheVillageIdiot-你关注Enigmativity评论吗?这会抛出一个错误`“无法隐式转换类型'System.Collections.Generic.list我不知道
bit\u sanity\u结果
BuildMetrics
类中有哪些属性。但您会发现需要在
select
语句中创建对象。@Villageidiot-不能将
var
作为类级变量声明。@Villageidiot也不需要使用