【问题标题】:Sql server sum(Case) convert to linqSql server sum(Case) 转换为 linq
【发布时间】:2021-04-08 06:41:27
【问题描述】:

我想总结一段时间内在两个位置使用了多少项目,但我卡在了控制器上

SQL 查询:

select ITEMID,
       ITEM_NAME,
       ITEM_TYPE,
       sum(case when PROVIDERID = 'PR000118' then QUANTITY else 0 end) as EAST,
       sum(case when PROVIDERID = 'PR000124' then QUANTITY else 0 end) as WEST,
       sum(QUANTITY) as TOTAL
from V_ITEMUSAGE 
where DATETIME >= '2021-03-01' and DATETIME <= '2021-03-31' and ITEM_TYPE like '%%'
group by ITEMID, ITEM_NAME, ITEM_TYPE
order by TOTAL desc

视图模型:

namespace HMO.viewmodel
{
    public class Itemusageviewmodel
    {
        public IEnumerable<ITEMTYPE> ITEMTYPEs{ get; set; }
        public IEnumerable<V_ITEMUSAGE> V_ITEMUSAGEs{ get; set; }
    }
}

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Itemusage (DateTime STARTDATE, DateTime ENDDATE, String TYPE)
{
    var table = new Itemusageviewmodel
    {
        ITEMTYPEs = db.ITEMTYPE.tolist(),
        V_ITEMUSAGEs = db.V_ITEMUSAGE
                       .Where(x => m.DATETIME >= STARTDATE && x.DATETIME <= ENDDATE  && x.ITEM_TYPE.Contains(TYPE))
                       //(I don't know what code I should use here)//
    };
    return View(table);
}

我希望 Controller 的结果 V_ITEMUSAGEs 与 SQL 查询的结果相同,我如何编写 V_ITEMUSAGEs 的代码?

谢谢

【问题讨论】:

  • 您尝试过 GroupBy 吗? docs.microsoft.com/en-us/ef/core/querying/…
  • 您拥有可以满足您需求的 SQL;为什么不直接使用那个SQL?您不必将所有内容都转换为 LINQ,而且并非所有内容都可以表示为 LINQ。
  • 感谢您的建议。我缺乏 C# 编程语言的经验,因为我开始使用它才 1 个月。
  • @MarcGravell 如果只使用那个 SQL 查询,如何实现它?因为对于 C#,我只知道使用 LINQ 进行全选和 where 条件。如果你能解释一下,我帮助了
  • @SDG 假设 db 这里是实体框架:docs.microsoft.com/en-us/ef/core/querying/raw-sql

标签: c# sql-server linq asp.net-mvc-4


【解决方案1】:

你可以试试这样的

b.V_ITEMUSAGE
 .Where(x => m.DATETIME >= STARTDATE && x.DATETIME <= ENDDATE  && x.ITEM_TYPE.Contains(TYPE))
 .GroupBy(x => new { x.ITEMID, x.ITEM_NAME, x.ITEM_TYPE })
 .Select(x => new ItemUsageViewModel {
       ItemId = x.Key.ITEMID,
       ItemName = x.Key.ITEM_Name,
       ItemType = x.Key.ITEM_TYPE,
       East = x.Where(it => it.PROVIDERID == 'PR000118').Sum(it => it.QUANTITY),
       West = x.Where(it => it.PROVIDERID == 'PR000124').Sum(it => it.QUANTITY),
       Total = x.Sum(it => it.QUANTITY)
  })

ItemUsageViewModel 是您定义的自定义 DTO 视图模型,应该类似于

public ItemUsageViewModel  
{
    public int ItemId {get; set;}
    public string ItemName {get; set;}
    public string ItemType {get; set;}
    public int East {get; set;}
    public int West {get; set;}
    public int Total {get; set;}
}

【讨论】:

  • 我已经尝试过了,但错误提示“无法隐式转换类型'十进制?'到 'int'。在 East、West 和 Total 上存在显式转换(您是否缺少演员表?)”
  • 您只需将上面模型中的int 属性类型更改为decimal。我说DTO应该是这样的,不完全是这样的。属性类型应该是什么完全取决于您的 cDB 列类型。毕竟您没有为V_ITEMUSAGE ITEMTYPE 提供架构表
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2017-11-16
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多