Каков тип возврата для анонимного выбора запроса linq? Что лучший способ состоит в том, чтобы передать эти данные обратно?

Это - основной вопрос. У меня есть основной настроенный проект SL4/RIA, и я хочу создать новый метод в доменном сервисе и возвратить некоторые данные из него. Я не уверен надлежащий самый легкий способ сделать это.. Я должен обернуть его в ToList ()? Я неясен, как обработать этот анонимный тип, который был, создают.. что самый легкий путь состоит в том, чтобы возвратить эти данные?

 public IQueryable<ApplicationLog> GetApplicationLogsGrouped()
    {
        var x = from c in ObjectContext.ApplicationLogs
                let dt = c.LogDate
                group c by new { y = dt.Value.Year, m = dt.Value.Month, d = dt.Value.Day } into mygroup
                select new { aaa = mygroup.Key, ProductCount = mygroup.Count() };

        return x;


        // return this.ObjectContext.ApplicationLogs.Where(r => r.ApplicationID < 50);
    }

Не может неявно преобразовать тип 'Система. Linq. IQueryable <AnonymousType#1>' к 'Системе. Linq. IQueryable <CapRep4. Сеть. ApplicationLog>'. Явное преобразование существует (Вы скучаете по броску?) 58 20 CapRep4. Сеть

5
задан AnthonyWJones 10 June 2010 в 09:49
поделиться

3 ответа

Анонимный тип похож на любой другой класс, но создается компилятором. Компилятор генерирует что-то вроде:

class AnonymousType1 {
  public AnonymousType2 Key { get; set; }
  public int ProductCount { get; set; }
}

class AnonymousType2 {
  public int y { get; set; }
  public int m { get; set; }
  public int d { get; set; }
}

Эти классы вам недоступны, поэтому у вас нет другого выбора, кроме как использовать собственный класс, соответствующий определению Anonymous1, если вы хотите сохранить строгую типизацию. Затем вы будете использовать его так: новый MyClass {Key = myGroup.Key, ProductCount = mygroup.Count ()} .

3
ответ дан 14 December 2019 в 08:42
поделиться

Попробуйте использовать KeyValuePair

public IQueryable<KeyValuePair<ApplicationLog,int>> GetApplicationLogsGrouped()
{
  var x = from c in ObjectContext.ApplicationLogs
          let dt = c.LogDate
          group by c  into mygroup
          select new KeyValuePair<ApplicationLog,int>( mygroup.Key,mygroup.Count()) ;

  return x;

  // return this.ObjectContext.ApplicationLogs.Where(r => r.ApplicationID < 50);
}
3
ответ дан 14 December 2019 в 08:42
поделиться

Вам нужно будет создать свой собственный класс для проекции.

public class ApplicationLogStatistic
{
    public ApplicationLog ApplicationLog { get; internal set; }
    public int ProductCount { get; internal set; }
}

...

public IQueryable<ApplicationLogStatistic> GetApplicationLogsGrouped()
{
    var x = // OP's code, except for select
        select new ApplicationLogStatistic 
                  { 
                       ApplicationLog = mygroup.Key, 
                       ProductCount = mygroup.Count() 
                  };
    return x;
}
1
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: