1

私が思ったのは、かなり単純なクエリでした。

通常の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で何に変換されるかを確認し、どこが間違っているのかを把握する方法はありますか?

助けてくれてありがとう、

マーク

4

2 に答える 2

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));

試すことができることの1つは、LinqPadのコピーを取得することです。これにより、データベースに対してLINQステートメントを実行し、生成されたSQLステートメントを表示できます。

于 2012-07-04T08:50:08.993 に答える
0

他のものは別として、

    d.agentName.StartsWith("ta")

元のSQLに表示されません...?

于 2012-07-04T08:49:40.107 に答える