从Sql转换为Linq

时间:2012-07-04 08:44:11

标签: asp.net sql-server asp.net-mvc asp.net-mvc-3 linq

我有,我认为这是一个非常简单的查询。

在普通的Sql中,这将是:

SELECT    [column names]
FROM      agentscheduledetail
WHERE     (date = '2012-07-04') AND 
           (
            exception = 'Break (No Sign Off)' OR
            exception = 'Break' OR
            exception = 'Break (Signed Out)'
           )

这会返回约900条记录。

然而,当我尝试将其输入我的控制器时,我最终得到了大约300,000条记录 - 所以我认为我的AND和OR不起作用。我已经尝试过Linqer,但是无法让它工作(我知道这可能不是真正的LINQ,而是VS中的等效查询 - 如果有一个linq版本......我也很感激如果可能的)。

我的控制器查询是:

        var dte = DateTime.Today;

        return View(db.agentscheduledetails.Where
           (
            d => d.date == dte && d.agentName.StartsWith("ta") && 
             (
              d.exception == "Break (No Sign Off)" || 
              d.exception == "Break" || 
              d.exception == "Break (Signed Out)"
             )
            ).ToList()
           );

任何人都可以a)让我知道我和我的&& || (和/或),或者b)有没有办法踩过VS中的代码,看看上面的查询在普通的SQL中转换成什么,这样我就可以试着弄明白我哪里出错?

感谢您的帮助,

标记

2 个答案:

答案 0 :(得分:1)

以下可能是您尝试执行的操作的简化版本,您的LINQ还包含与比较代理名称的SQL相比的附加语句吗?

var currentDate = DateTime.Today;
var exceptionTypes = new List<string>() { "Break (No Sign Off)", 
                                          "Break", "Break (Signed Out)" };

db.agentscheduledetails.Where(d => d.date == currentDate && 
                                           exceptionTypes.Contains(d.exception));

您可以尝试的一件事是获取LinqPad的副本,这将允许您针对数据库运行LINQ语句,并将向您显示生成的SQL语句是什么。

答案 1 :(得分:0)

除此之外,

    d.agentName.StartsWith("ta")

没有出现在您的原始sql中??