【问题标题】:How can I convert a SQL script into Linq如何将 SQL 脚本转换为 Linq
【发布时间】:2014-02-26 10:29:10
【问题描述】:

我确实有一个无法翻译成 linq 的 sql 脚本。愿你们中的一个人能帮助我找到正确的方向。

我的大问题是计数和分组:

SELECT
    wfs.ServerId,
    COUNT(wfss.Name) AS Records,
    wfs.DiskId
FROM WorkflowStep wfs
INNER JOIN WorkflowStepStatus wfss ON wfs.WorkflowStepStatusId = wfss.Id
WHERE wfs.WorkflowId = (
                            SELECT
                                Id
                            FROM Workflow wf
                            WHERE wf.Name = 'Collecting data virutal'
                        )
AND wfs.StepNumber IN (1, 2, 3)
AND wfss.Name = 'Processed'
GROUP BY    wfs.ServerId,
            wfss.Name,
            wfs.DiskId

【问题讨论】:

  • 你能展示一个类模型,这样导航属性和关联的多样性是可见的吗?另外,告诉它应该是哪种 LINQ 风格。你试过 Linqer 吗?
  • 你不能比较wfs.WorkflowId(SELECT Id FROM Workflow wf WHERE wf.Name = 'Collecting data virutal') 你需要使用IN 运算符,比如wfs.WorkflowId IN ( SELECT Id FROM Workflow wf WHERE wf.Name = 'Collecting data virutal'),对吗?

标签: sql linq count group-by


【解决方案1】:

这应该可以工作

var result = wfs.Join(wfss, 
    t => t.WorkflowStepStatusId, 
    u => u.ID, 
    (t, u) => new {
        t.ServerID,
        t.WorkflowId,
        t.StepNumber,
        u.Name,
        t.DiskID
    })
    .Where(t => t.WorkflowId == wf.FirstOrDefault(u => u.Name == "Collecting data virutal").ID &&
                t.Name == "Processed" &&
                new List<int> { 1, 2, 3 }.ToArray().Contains(t.StepNumber))
    .GroupBy(t => new { t.ServerID, t.Name, t.DiskID })
    .Select(t => new {
         t.Key.ServerID,
         Records = t.Key.Name.Count(),
         t.Key.DiskID
    })
    .ToList();

【讨论】:

  • 简单更正:t.Key.Name没有方法Count,代替t.Key.Name.Count(),可以试试这个Records = t.Count()
猜你喜欢
  • 2015-03-14
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2011-02-14
相关资源
最近更新 更多