Нужна помощь в определении типа возврата - PullRequest
2 голосов
/ 15 ноября 2011

Вот метод:

public IEnumerable<???> GetAllSiteVisits()
{
    var visits =
        _db.STEWARDSHIP
           .OrderByDescending(r => r.VISIT_DATE)
           .Select(r => new
               {
                   id = r.STEWARDSHIP_ID,
                   name = r.SITE.SITE_NAME,
                   visit_date = r.VISIT_DATE,
                   visit_type = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC
               });
    return visits;
}

Я использую Entity Framework 4.2.

Так что проблема заключается в определении типа возврата.Если бы я просто использовал информацию непосредственно из таблицы БД, я бы возвратил IEnumerable<STEWARDSHIP>, но, поскольку я выбираю только определенные поля, я не понимаю, какой тип возврата.

Ответы [ 3 ]

8 голосов
/ 15 ноября 2011

Возвращаемым типом будет коллекция AnonymousType, где каждый элемент представляет класс со следующими свойствами:

  • id (с типом r.STEWARDSHIP_ID)
  • name (с типом r.SITE.SITE_NAME)
  • visit_date (с типом r.VISIT_DATE)
  • visit_type (с типом r.VISIT_TYPE_VAL.VISIT_TYPE_DESC)

Затем вы можете просмотреть элементы, используя цикл foreach:

foreach(var item in visits)
{
   string visitInfo = String.Format(
                        CultureInfo.InvariantCulture,
                        "Id: {0}, Name: {1}, Date: {2}, Type: {3}",
                        item.id,
                        item.name,
                        item.visit_date,
                        item = visit_type);

   Debug.WriteLine(visitInfo);       
}

Если вам нужно вернуть результаты запроса из метода, вы можете ввести новый класс, который представляет эти свойства:

// TODO: update types of the properties
class VisitDetails
{
   public string Id { get; private set; }
   public string Name { get; private set; }
   public DateTime VisitDate { get; private set; }
   public string VisitType { get; private set; }
}

И обновить запрос для создания экземпляров VisitDetails, а не анонимного типа:

.Select(r => new VisitDetails
    {                      
        Id = r.STEWARDSHIP_ID,                      
        Name = r.SITE.SITE_NAME,
        VisitDate = r.VISIT_DATE,
        VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC                  
    });   

Таким образом, тип возвращаемого значения будет IEnumerable<VisitDetails>, поэтому вы легко можете даже вернуть результаты самого запроса из метода, указав также точный тип возвращаемого значения, так что код будет очень чистым.

Подробнее см. Инициализаторы объектов с анонимными типами .

2 голосов
/ 15 ноября 2011

Вы не можете вернуть AnonymousType как возвращаемое значение из метода.Вам нужно будет создать тип, который вы заполняете в своем linq:

    public IEnumerable<SiteVisit> GetAllSiteVisits()
{
    var visits =
        _db.STEWARDSHIP
           .OrderByDescending(r => r.VISIT_DATE)
           .Select(r => new SiteVisit
               {
                   Id = r.STEWARDSHIP_ID,
                   Name = r.SITE.SITE_NAME,
                   VisitDate = r.VISIT_DATE,
                   VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC
               });
    return visits;
}
2 голосов
/ 15 ноября 2011

Вы не сможете, он возвращает анонимный тип. Прочитайте документацию MSDN по этой теме.

Одной из альтернатив может быть создание конкретной реализации с использованием класса, который имеет

  • ID
  • имя
  • visit_date
  • тип_ посещения

как свойства

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