不能隐式转换类型
本文关键字:类型 转换 不能 | 更新日期: 2023-09-27 18:05:39
这不是我第一次被集合卡住了。我错过了一些东西,感觉不仅仅是有点沮丧。该代码片段用于返回REVIEW数据库中具有指定"餐厅id"的"餐厅评论"的计数。我再次得到一个"不能隐式隐蔽类型"错误。
提前感谢!
public IEnumerable<string> getNumReviews(int RestID)
{
var NumReviews = from REVIEW in db.REVIEWs
where REVIEW.REST_ID == RestID
group REVIEW by REVIEW.REVIEW_ID into t
select new { REVIEW_ID = t.Key, TagCount = t.Count() };
return NumReviews;
}
你的方法应该返回IEnumerable<string>
,但你的代码返回一个匿名对象的集合。显然这两者是不一样的。
看起来您需要创建一个具体类型而不是匿名类型,然后修改您的方法以返回适当的集合:
public class ConcreteType
{
public string ReviewId { get; set; }
public int TagCount { get; set; }
}
然后改变方法:
public IEnumerable<ConcreteType> GetNumReviews(int restId)
{
return from REVIEW in db.REVIEWs
where REVIEW.REST_ID = restId
group REVIEW by REVIEW.REVIEW_ID into t
select new ConcreteType
{
ReviewId = t.Key,
TagCount - t.Count()
};
}
NumReviews
是IEnumerable<anonymous type>
,不是IEnumerable<string>
。特别是,您将返回一个对象的枚举,其中包括REVIEW_ID
和,以及每个评论的标记计数。
最好的选择是声明一个类型来封装该信息:
public class NumReviewInfo
{
public int ReviewId { get; set; }
public int NumTags { get; set; }
}
然后,从方法中选择该对象:
public IEnumerable<NumReviewsInfo> getNumReviews(int RestID)
{
var NumReviews = from REVIEW in db.REVIEWs
where REVIEW.REST_ID == RestID
group REVIEW by REVIEW.REVIEW_ID into t
select new NumReviewsInfo { ReviewId = t.Key, NumTags = t.Count() };
return NumReviews;
}
问题是您的NumReviews
集合类型为IEnumerable<anonymous type>
,但它被用作类型为IEnumerable<string>
的函数的返回。您需要
- 修改select语句返回
string
- 更改返回类型和选择语句以生成具体类型
struct Data {
internal int REVIEW_ID;
internal int TagCount;
}
public IEnumerable<Data> getNumReviews(int RestID) {
var NumReviews = from REVIEW in db.REVIEWs
where REVIEW.REST_ID == RestID
group REVIEW by REVIEW.REVIEW_ID into t
select new Data { REVIEW_ID = t.Key, TagCount = t.Count() };
return NumReviews;
}
不能保证从查询中获得可枚举的集合。您必须调用.ToList()
来获得一个列表,这是可枚举的。
您将通过以下操作返回匿名类型:
select new { REVIEW_ID = t.Key, TagCount = t.Count() };
这是一个复杂类型。然而,你的方法签名需要一个字符串集合。
select REVIEW_ID = t.Key
将匹配您当前的方法签名,或者简单地更改您的方法签名以返回复杂类型(可能是Tuple<string,int>
?)和:
public IEnumerable<Tuple<string,int>> getNumReviews(int RestID)
{
return
(
from REVIEW in db.REVIEWs
where REVIEW.REST_ID == RestID
group REVIEW by REVIEW.REVIEW_ID into t
select new Tuple<string,int>( t.Key, t.Count() );
);
}