3

したがって、私の ASP.NET MVC4 アプリは EF を使用します。私の特定の状況では、ロジックの一部を SQL ビューに実装し、残りを EF に実装することにしました。これは、以前に使用して成功したアプローチです。可能な限り EF を使用しますが、EF よりも TSQL の方が簡単に見えるロジックのビューで TSQL を使用します。これが私のTSQLビューです:

SELECT P.DeviceID, P.PhoneNumber, E.FullName, Effective  
FROM PhoneNumbers P 
    INNER JOIN Devices D ON D .DeviceID = P.DeviceID 
    LEFT OUTER JOIN vEmployees E ON P.AssignedEmployeeNumber = E.EmployeeID
UNION
SELECT H.DeviceID, H.PhoneNumber, E.FullName, MIN(Effective) AS Effective
FROM PhoneNumberHistory H 
    INNER JOIN Devices D ON D .DeviceID = H.DeviceID 
    LEFT OUTER JOIN vEmployees E ON H.AssignedEmployeeNumber = E.EmployeeID
GROUP BY H.DeviceID, H.PhoneNumber, E.FullName

また、EF を呼び出しているサービス コードではあまり処理が行われていません。

return this.deviceHistoryRepository.GetMany(d => d.DeviceID == id)
           .OrderByDescending(d => d.Effective).ToList();

単純に、SQL から直接ビューを実行した場合 (もちろん、DeviceID を指定するために WHERE 句を使用)、および EF への呼び出しを介して同じデータが返されることを期待します。しかし、代わりに、EF の結果には行が欠落しており、行が重複しています。足りないものはありますか?EF が TSQL を正しく使用できるように、ビューの TSQL に追加できるものはありますか?

4

1 に答える 1

1

はい、あることがわかりました (EF が正しく使用できるように、ビューで SQL に追加できるもの)。EF は、ビューの結果を適切に処理するために、一意の null 非許容キーを必要とします。

SELECT ISNULL(ROW_NUMBER() OVER(ORDER BY (SELECT 0)), -1) AS DeviceHistoryID, *
FROM (
    -- original TSQL from above --
) AS XYZ 

ビューの結果の並べ替えと操作に EF を使用しているため、ビュー内の順序は気にしません。ただし、OVER 句には ORDER BY が必要なので、「SELECT 0」です。サブクエリを XYZ にエイリアスしているのはなぜですか? エイリアスが使用されていない場合でも、エイリアスがない場合、TSQL は構文エラーで停止します。ISNULL は、この列をエンティティ キーとしてマークする必要があることを EF に通知します。(そのようにマークされていないと、返される結果が正しくない可能性があります。)

于 2013-09-19T00:54:33.647 に答える