GroupBy和Distinct不工作

时间:2015-04-21 15:16:19

标签: c# sql json linq

我正在使用C#和linQ开发一个项目。我想从BDD返回一个JsonList。一切都很好,直到我尝试分组,每个id只有一次(我也可以使用不同的)。 这是代码:

[HttpPost]
    public ActionResult ProcessTypeStep()
    {
       var result = from a in db.ProcessTypeStep
       join b in db.ProcessStep on a.ProcessTypeStepId equals b.ProcessTypeStepId
       join c in db.ProcessStepOwner on b.ProcessStepId equals c.ProcessStepId
       join e in db.ProcessTypeStepDesc on a.ProcessTypeStepId equals e.ProcessTypeStepId
       select new { e.ProcessTypeStepId, e.ShortDescription };
       result.Distinct();
       result.GroupBy(w => w.ProcessTypeStepId).ToList();
       return Json(result, JsonRequestBehavior.AllowGet);
    }

所以这段代码返回1000行,我只想按ID分组或使用distinct,但两者都不起作用。什么都没有改变。

这是SQL中的代码,它正在运行:

select a.ProcessTypeStepId,e.ShortDescription
from ProcessTypeStep a
INNER join ProcessStep b on a.ProcessTypeStepId = b.ProcessTypeStepId
INNER  join ProcessStepOwner c on b.ProcessStepId = c.ProcessStepId   
INNER JOIN ProcessTypeStepDesc e on e.ProcessTypeStepId =a.ProcessTypeStepId
GROUP BY a.ProcessTypeStepId,e.ShortDescription

4 个答案:

答案 0 :(得分:7)

例如,

result.Distinct()返回一个新对象,但不会改变原始result。因此,如果您不分配或将其传递给某些内容,则此语句无效。 GroupByToList也是如此。替换:

result.Distinct();
result.GroupBy(w => w.ProcessTypeStepId).ToList();
return Json(result, JsonRequestBehavior.AllowGet);

使用:

return Json(result.Distinct().GroupBy(w => w.ProcessTypeStepId).ToList(), JsonRequestBehavior.AllowGet);

或者至少将LINQ操作的返回值赋给变量:

result = result.Distinct();
result = result.GroupBy(w => w.ProcessTypeStepId).ToList();
return Json(result, JsonRequestBehavior.AllowGet);

答案 1 :(得分:2)

LINQ操作在其输入上产生不可变的变化,而不是自己更改输入对象,因此这两行代码本身不做任何事情:

   result.Distinct();
   result.GroupBy(w => w.ProcessTypeStepId).ToList();

相反,您可以捕获每个操作的结果:

   var distinctResult = result.Distinct();
   var groupedResult = distinctResult.GroupBy(w => w.ProcessTypeStepId).ToList();
   return Json(groupedResult, JsonRequestBehavior.AllowGet);

答案 2 :(得分:1)

尝试

result = result.Distinct().GroupBy(w => w.ProcessTypeStepId).ToList();

只使用result.Distinct()不修改列表,它会返回一个新列表。

答案 3 :(得分:1)

  

试试这个可能会有所作为谢谢......:)

[HttpPost]
    public ActionResult ProcessTypeStep()
    {
       var result = from a in db.ProcessTypeStep
       join b in db.ProcessStep on a.ProcessTypeStepId equals         b.ProcessTypeStepId
       join c in db.ProcessStepOwner on b.ProcessStepId equals     c.ProcessStepId
       join e in db.ProcessTypeStepDesc on a.ProcessTypeStepId equals     e.ProcessTypeStepId
group by new
    {
        a.ProcessTypeStepId,
        e.ShortDescription
    } into GBC
select new { GBC.ProcessTypeStepId, GBC.ShortDescription };
result.Distinct();
return Json(result, JsonRequestBehavior.AllowGet);