无法隐式转换类型

时间:2011-08-16 14:32:55

标签: c# linq collections

这不是我第一次被困在收藏品上。我在这里错过了一些东西,感觉不仅仅是有点沮丧。此代码段设计返回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;
    }

5 个答案:

答案 0 :(得分:2)

您的方法应该返回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()
           };
}

答案 1 :(得分:1)

问题是您的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;
}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您无法保证获得可从查询中枚举的集合。您必须在其上调用.ToList()才能获得可枚举的列表。

答案 4 :(得分:0)

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

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