不能隐式转换类型

本文关键字:类型 转换 不能 | 更新日期: 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()
           };
}

NumReviewsIEnumerable<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() );
    );
}