Каков тип возврата для выбора анонимного запроса linq? Каков наилучший способ отправить эти данные обратно? - PullRequest
5 голосов
/ 10 июня 2010

Это основной вопрос.У меня настроен базовый проект 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);
    }

Не удается неявно преобразовать тип 'System.Linq.IQueryable'to' System.Linq.IQueryable».Существует явное преобразование (вам не хватает приведения?) 58 20 CapRep4.Web

Ответы [ 3 ]

3 голосов
/ 10 июня 2010

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

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, если вы хотите продолжать строгую типизацию. Затем вы будете использовать его так: new MyClass { Key = myGroup.Key, ProductCount = mygroup.Count() }.

3 голосов
/ 10 июня 2010

Попробуйте использовать 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);
}
1 голос
/ 10 июня 2010

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

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