【问题标题】:Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.IQueryable<>'无法将类型“System.Linq.IQueryable<AnonymousType#1>”隐式转换为“System.Linq.IQueryable<>”
【发布时间】:2015-06-22 23:49:08
【问题描述】:
public IQueryable<DepartmentBreakdownReport> GetDepartmentBreakdownByReviewID(int ClientID, int? ReviewID) {
    var x = (from d in camOnlineDb.Details
             join h in camOnlineDb.Headers
             on new { d.ClientID, d.ClaimID }
             equals new { h.ClientID, h.ClaimID }
             where h.ClientID == d.ClientID

             join sd in camOnlineDb.SuppDepts
             on new { a = d.ClientID, b = d.CategoryID ?? 0 }
             equals new { a = sd.ClientID, b = sd.CategoryID }

             join r in camOnlineDb.Reviews
             on new { h.ClientID, h.ReviewID }
             equals new { r.ClientID, r.ReviewID }

             join rp in camOnlineDb.ReviewPeriods
             on new { a = r.ClientID, b = r.ReviewPeriodID ?? 0 }
             equals new { a = rp.ClientID, b = rp.ReviewPeriodID }

             select new {
                 d.ClientID,
                 h.ReviewID,
                 sd.DepartmentID,
                 sd.DepartmentName,
                 d.Amount
             });

    x.GroupBy(r => new { r.DepartmentID, r.ReviewID, r.ClientID })
    .Select(g => new {
        ClientID = g.Key.ClientID,
        ReviewID = g.Key.ReviewID,
        Dept = g.Max(d => d.DepartmentName),
        Amount = g.Sum(d => d.Amount)
    })
    .OrderBy(r => r.Dept)
    .Where(r => r.ReviewID == 37);
    //.Dump();

    return x;

我知道这与返回 x 有关。我尝试返回是 asQueryable 但这没有用。如何让我的语句返回 x?

【问题讨论】:

  • 你选择匿名类型再见.Select(g =&gt; new你不能这样返回,搜索returning anonymous types
  • 至少有一个错误... 从x.GroupBy 开始,您不会将结果保存在任何地方... GroupBy 将被丢弃。
  • @Habib 从技术上讲,他可以返回 IQueryable&lt;object&gt;,但 99% 的情况下它是无用的(IQueryable&lt;&gt; 是协变的)
  • 嗨,DepartmentBreakdownReport 确实包含我希望设置的所有字段。但是我需要对我的一些结果进行分组和排序。我需要知道如何返回一组包含此排序数据的结果
  • DepartmentBreakdownReport 看起来像是一个框架生成的实体,我不认为它可以用于 Select 的项目中

标签: c# linq


【解决方案1】:

x 是一个IQueryable&lt;T&gt;,其中T 是具有ClientIDReviewIDDepartmentIDDepartmentNameAmount 方法的匿名类型。

在某些时候,您需要执行 select new DepartmentBreakdownReport(…)select new DepartmentBreakdownReport{…}.Select(something =&gt; new DepartmentBreakdownReport(…)).Select(something =&gt; new DepartmentBreakdownReport{…})。 (其实都是一样的。

这会给你一个IQueryable&lt;DepartmentBreakdownReport&gt;,因为它选择的类型是DepartmentBreakdownReport

还要注意,代码中的代码x.GroupBy(r =&gt; new { r.DepartmentID, r.ReviewID, r.ClientID }) 等实际上什么都不做;它会创建一个新的查询,但是这个新的查询永远不会被使用,甚至不会被触及。

【讨论】:

    【解决方案2】:

    我之前的评论的意思是你想创建(并返回)DepartmentBreakdownReport 的实例,而不是匿名类型。

    return x.Where(r => r.ReviewID == 37)
            .GroupBy(r => new { r.DepartmentID, r.ReviewID, r.ClientID })
            .Select(g => new DepartmentBreakdownReport
                             {
                                 ClientID = g.Key.ClientID,
                                 ReviewID = g.Key.ReviewID,
                                 Dept = g.Max(d => d.DepartmentName),
                                 Amount = g.Sum(d => d.Amount)
                             })
            .OrderBy(r => r.Dept);
    

    我根据个人喜好对查询进行了重新排序,但它应该会产生相同的结果。

    另外,我不知道您是否必须在末尾添加AsQueryable()...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2011-03-25
      相关资源
      最近更新 更多