Не могу конвертировать тип - PullRequest
0 голосов
/ 16 августа 2011

Это не первый раз, когда я застреваю в коллекциях.Я что-то здесь упускаю и чувствую себя не просто разочарованным.Этот фрагмент кода предназначен для возврата количества «отзывов о ресторанах» в базе данных «REVIEW» с указанным «идентификатором ресторана».Я снова получаю сообщение об ошибке " неявно скрытого типа ".

Заранее спасибо!

    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 ]

2 голосов
/ 16 августа 2011

Ваш метод должен возвращать 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 голос
/ 16 августа 2011

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;
}
1 голос
/ 16 августа 2011

Проблема в том, что ваша коллекция NumReviews напечатана на IEnumerable<anonymous type>, но она используется как возвращение функции, которая набрана на IEnumerable<string>. Вам нужно либо

  • Изменить оператор выбора, чтобы он возвращал 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;
}
0 голосов
/ 16 августа 2011

Вы возвращаете анонимный тип, выполняя:

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() );
    );
}
0 голосов
/ 16 августа 2011

Вам не гарантировано получить коллекцию, которую можно перечислить по запросу.Вам нужно будет вызвать .ToList(), чтобы получить список, который можно перечислить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...