C# 无法隐式转换类型

C# 无法隐式转换类型,c#,linq,collections,C#,Linq,Collections,这不是我第一次被困在收藏上。我在这里错过了一些东西,感觉不仅仅是有点沮丧。此代码段用于返回REVIEW db中具有指定“restaurant id”的“restaurant reviews”的计数。我再次收到一个“不能隐式转换类型”错误 提前谢谢 public IEnumerable<string> getNumReviews(int RestID) { var NumReviews = from REVIEW in db.REVIEWs

这不是我第一次被困在收藏上。我在这里错过了一些东西,感觉不仅仅是有点沮丧。此代码段用于返回REVIEW db中具有指定“restaurant id”的“restaurant reviews”的计数。我再次收到一个“不能隐式转换类型”错误

提前谢谢

    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;
    }
public IEnumerable getNumReviews(int-RestID)
{
var NumReviews=来自db.REVIEWs中的REVIEW
其中REVIEW.REST\u ID==RestID
按审核分组审核。审核ID为t
选择新{REVIEW_ID=t.Key,TagCount=t.Count()};
返回NumReviews;
}

您的方法应该返回
IEnumerable
,但您的代码返回的是匿名对象的集合。很明显,这两者并不相同

看起来您需要创建具体类型而不是匿名类型,然后修改方法以返回适当的集合:

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()
           };
}
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;
}
public IEnumerable GetNumReviews(int-restId)
{
从db.REVIEWs中的审阅返回
其中REVIEW.REST\u ID=restId
按审核分组审核。审核ID为t
选择新的混凝土类型
{ 
ReviewId=t.键,
TagCount-t.Count()
};
}

您的方法应该返回
IEnumerable
,但您的代码返回的是匿名对象的集合。很明显,这两者并不相同

看起来您需要创建具体类型而不是匿名类型,然后修改方法以返回适当的集合:

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()
           };
}
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;
}
public IEnumerable GetNumReviews(int-restId)
{
从db.REVIEWs中的审阅返回
其中REVIEW.REST\u ID=restId
按审核分组审核。审核ID为t
选择新的混凝土类型
{ 
ReviewId=t.键,
TagCount-t.Count()
};
}

问题是您的
NumReviews
集合被键入到
IEnumerable
中,但它被用作返回键入到
IEnumerable
的函数。你要么

  • 更改select语句以返回
    字符串
  • 更改返回类型和select语句以生成具体类型
比如说

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;
}
结构数据{code> 内部内部审查; 内部int标记计数; } 公共IEnumerable getNumReviews(int-RestID){ var NumReviews=来自db.REVIEWs中的REVIEW 其中REVIEW.REST\u ID==RestID 按审核分组审核。审核ID为t 选择新数据{REVIEW_ID=t.Key,TagCount=t.Count()}; 返回NumReviews; }
问题是您的
NumReviews
集合被键入到
IEnumerable
中,但它被用作返回键入到
IEnumerable
的函数。你要么

  • 更改select语句以返回
    字符串
  • 更改返回类型和select语句以生成具体类型
比如说

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;
}
结构数据{code> 内部内部审查; 内部int标记计数; } 公共IEnumerable getNumReviews(int-RestID){ var NumReviews=来自db.REVIEWs中的REVIEW 其中REVIEW.REST\u ID==RestID 按审核分组审核。审核ID为t 选择新数据{REVIEW_ID=t.Key,TagCount=t.Count()}; 返回NumReviews; }
不能保证从查询中获得可枚举的集合。您必须对其调用
.ToList()
,才能获得可枚举的列表。

您不能保证从查询中获得可枚举的集合。您必须对其调用
.ToList()
,以获取可枚举的列表。

NumReviews
是一个
IEnumerable
,而不是
IEnumerable
。特别是,您正在返回一个对象枚举,其中包括一个
REVIEW\u ID
和每个REVIEW的标记计数

最好的选择是声明一个类型来封装该信息:

public class NumReviewInfo
{
    public int ReviewId { get; set; }
    public int NumTags { 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()
           };
}
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;
}
public IEnumerable getNumReviews(int-RestID)
{
var NumReviews=来自db.REVIEWs中的REVIEW
其中REVIEW.REST\u ID==RestID
按审核分组审核。审核ID为t
选择newnumreviewsinfo{ReviewId=t.Key,NumTags=t.Count()};
返回NumReviews;
}

NumReviews
是一个
IEnumerable
,而不是
IEnumerable
。特别是,您正在返回一个对象枚举,其中包括一个
REVIEW\u ID
和每个REVIEW的标记计数

最好的选择是声明一个类型来封装该信息:

public class NumReviewInfo
{
    public int ReviewId { get; set; }
    public int NumTags { 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()
           };
}
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;
}
public IEnumerable getNumReviews(int-RestID)
{
var NumReviews=来自db.REVIEWs中的REVIEW
其中REVIEW.REST\u ID==RestID
按审核分组审核。审核ID为t
选择newnumreviewsinfo{ReviewId=t.Key,NumTags=t.Count()};
返回NumReviews;
}

您正在通过执行以下操作返回匿名类型:

select new { REVIEW_ID = t.Key, TagCount = t.Count() };
这是一个复杂的类型。然而,您的方法签名需要一组字符串

您可以:

select REVIEW_ID = t.Key
它将匹配您当前的方法签名,或者简单地更改您的方法签名以返回复杂类型(可能是
元组
?),并且:

public IEnumerable getNumReviews(int-RestID)
{
返回
(
来自db.REVIEWs中的REVIEW
其中REVIEW.REST\u ID==RestID
按审核分组审核。审核ID为t
选择新元组(t.Key,t.Count());
);
}