匿名linq查询选择的返回类型是什么?发回这些数据的最佳方法是什么?

时间:2010-06-09 21:37:41

标签: linq silverlight linq-to-entities silverlight-4.0

这是一个基本问题。我已经设置了基本的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&lt; AnonymousType#1&gt;'到'System.Linq.IQueryable&lt; CapRep4.Web.ApplicationLog&gt;'。存在显式转换(您是否缺少演员?)58 20 CapRep4.Web

3 个答案:

答案 0 :(得分:3)

尝试使用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 :(得分: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的定义匹配的自定义类,而是要保持强类型。然后,您将使用它:new MyClass { Key = myGroup.Key, ProductCount = mygroup.Count() }

答案 2 :(得分:1)

您需要为投影创建自己的类。

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