3

わかりました、次の SQL クエリを Linq 式に複製しようとしています。

SELECT
    I.EmployeeNumber,
    E.TITLE,
    E.FNAM, 
    E.LNAM
FROM
    Incidents I INNER JOIN Employees E ON I.IncidentEmployee = E.EmployeeNumber
GROUP BY
    I.EmployeeNumber,
    E.TITLE,
    E.FNAM, 
    E.LNAM

十分に単純です(または少なくとも私は思っていました):

var query = (from e in contextDB.Employees
              join i in contextDB.Incidents on i.IncidentEmployee = e.EmployeeNumber
              group e by new { i.IncidentEmployee, e.TITLE, e.FNAM, e.LNAM } into allIncEmps
              select new
                          {
                              IncEmpNum = allIncEmps.Key.IncidentEmployee
                              TITLE = allIncEmps.Key.TITLE,
                              USERFNAM = allIncEmps.Key.FNAM,
                              USERLNAM = allIncEmps.Key.LNAM
                          });

しかし、期待どおりの結果が得られないため、SQL プロファイラーを起動して、パイプを介して SQL Server に送信されているものを確認すると、次のように表示されます。

SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM ( SELECT DISTINCT 
        [Extent2].[IncidentEmployee] AS [IncidentEmployee], 
        [Extent1].[TITLE] AS [TITLE], 
        [Extent1].[FNAM] AS [FNAM], 
        [Extent1].[LNAM] AS [LNAM]
        FROM  [dbo].[Employees] AS [Extent1]
        INNER JOIN [dbo].[INCIDENTS] AS [Extent2] ON ([Extent1].[EmployeeNumber] = [Extent2].[IncidentEmployee]) OR (([Extent1].[EmployeeNumber] IS NULL) AND ([Extent2].[IncidentEmployee] IS NULL))
    )  AS [Distinct1]
)  AS [GroupBy1]

SQL Server に送信された SQL 文字列からわかるように、返されると予想していたフィールドが Select 句に含まれていません。私は何を間違っていますか?

アップデート

非常に長い 1 日でした。もう一度コードを実行したところ、パイプに送信された SQL が次のようになりました。

SELECT 
[Distinct1].[IncidentEmployee] AS [IncidentEmployee], 
[Distinct1].[TITLE] AS [TITLE], 
[Distinct1].[FNAM] AS [FNAM], 
[Distinct1].[LNAM] AS [LNAM]
FROM ( SELECT DISTINCT 
    [Extent1].[OFFNUM] AS [OFFNUM], 
    [Extent1].[TITLE] AS [TITLE], 
    [Extent1].[FNAM] AS [FNAM], 
    [Extent1].[LNAM] AS [LNAM]
    FROM  [dbo].[Employees] AS [Extent1]
    INNER JOIN [dbo].[INCIDENTS] AS [Extent2] ON ([Extent1].[EmployeeNumber] = [Extent2].[IncidentEmployee]) OR (([Extent1].[EmployeeNumber] IS NULL) AND ([Extent2].[IncidentEmployee] IS NULL))
)  AS [Distinct1]

しかし、レコード セットをループしようとすると、まだ結果が表示されません。

foreach (var emps in query)
{

}
4

1 に答える 1

1

クエリが返すべきものを返さない理由はわかりませんが、グループキーのみをクエリし、グループ化された結果をクエリしないため、次のようなものしか得られないことがわかりましたDistinct()

var query =
(from e in contextDB.Employees
 join i in contextDB.Incidents on i.IncidentEmployee equals e.EmployeeNumber
 select new
 {
     IncEmpNum = i.IncidentEmployee
     TITLE = e.TITLE,
     USERFNAM = e.FNAM,
     USERLNAM = e.LNAM
 }).Distinct();

しかし、EF はこれを十分に認識し、DISTINCT クエリも作成しました。

期待した結果と実際の結果がどのように異なっていたかを指定していませんが、グループ化によってDistinct.

しかし、あなたのコードはどのようにコンパイルされましたか? xeondev が気付いたように、結合ステートメントではなくequalsinが必要です。=それ以外の場合、私のコンパイラ (:D) はそれを飲み込みません。生成された SQL 結合も奇妙です。結合された値が両方とも NULL であるレコードにも一致します。i.IncidentEmployeeこれにより、キーの少なくとも 1 つ (またはe.EmployeeNumber) が null 可能であり、またはその両方を使用する必要があるとi.IncidentEmployee.Value思わe.EmployeeNumber.Valueれます。

于 2012-09-29T17:48:53.650 に答える