EF寫統計


EF的特性是,你from的第一個表為主表,接下來的所有表以左聯或者內聯或者交叉連接的方式去顯示,不會出現右聯,

在編寫的時候,可以先確定個數據源,然后對這個數據源進行數據的統計,

例如SQL:

-- Region Parameters
DECLARE @p0 VarChar(1000) = 'ExamImage'
DECLARE @p1 VarChar(1000) = ''
DECLARE @p2 Float = 1024
DECLARE @p3 Float = 1024
-- EndRegion
SELECT SUM(((CONVERT(Float,[t6].[value])) / @p2) / @p3) AS [FileSize], MAX([t6].[value2]) AS [UploadTime], [t6].[ResultDate]
FROM (
    SELECT [t3].[FileSize] AS [value], [t3].[UploadTime] AS [value2], [t0].[ResultDate], [t3].[TypeCode], [t0].[ServiceSectID], [t3].[DeleteFlag]
    FROM [a] AS [t0]
    LEFT OUTER JOIN [b] AS [t1] ON [t0].[VisitUID] = ([t1].[VisitUID])
    LEFT OUTER JOIN [c] AS [t2] ON ([t0].[PatientID] = [t2].[PatientID]) AND ([t0].[PatientMasterID] = [t2].[PatientMasterID])
    LEFT OUTER JOIN [d] AS [t3] ON (CONVERT(NVarChar(MAX),[t0].[ObservationUID])) = [t3].[BusinessID]
    LEFT OUTER JOIN [e] AS [t4] ON [t3].[FileUID] = [t4].[FileUID]
    LEFT OUTER JOIN [f] AS [t5] ON [t0].[OrganizationID] = [t5].[OrganizationID]
    ) AS [t6]
WHERE ([t6].[TypeCode] = @p0) AND ([t6].[ServiceSectID] <> @p1) AND (NOT ([t6].[DeleteFlag] = 1))
GROUP BY [t6].[ResultDate]

翻譯成linq可以進行如下寫法:

 from item in
                        (
                            from o in a
                            join v in b on o.VisitUID equals v.VisitUID into o_vJoin
                            from o_v in o_vJoin.DefaultIfEmpty()
                            join p in b on new { PatientID = o.PatientID, PatientMasterID = o.PatientMasterID } equals new { p.PatientID, p.PatientMasterID } into o_pJoin
                            from o_v_p in o_pJoin.DefaultIfEmpty()
                            join d in c on o.ObservationUID.ToString() equals d.BusinessID into o_dJoin
                            from o_v_p_d in o_dJoin.DefaultIfEmpty()
                            join dis in d on o_v_p_d.FileUID equals dis.FileUID into d_disJoin
                            from o_v_p_d_dis in d_disJoin.DefaultIfEmpty()
                            join om in e on o.OrganizationID equals om.OrganizationID into o_omJoin
                            from o_v_p_d_dis_om in o_omJoin.DefaultIfEmpty()
                            where o_v_p_d.TypeCode == "ExamImage" && o.ServiceSectID != "" && !o_v_p_d.DeleteFlag
                            select new
                            {
                                FileSize = o_v_p_d.FileSize,
                                UploadTime = o_v_p_d.UploadTime,
                                ResultDate = o.ResultDate
                            }
                        )
                    group item by new { item.ResultDate} into res
                    select new
                    {
                        FileSize = res.Sum(t => t.FileSize/1024d/1024d),
                        UploadTime = res.Max(t => t.UploadTime),
                        ResultDate = res.Select(t => t.ResultDate),
                    }

如果需要映射到一個已有的實體,可以進行如下寫法:

  var classInfoSql = getBasicDataByOrderSql.ToList().Select(s => new ClassInfo
                {
                    FileSize = s.FileSize,
                    OrganizationID = s.OrganizationID
                });

其中 

getBasicDataByOrderSql
就是上面分組后的linq語句

這其中涉及到了多表連接,以及使用聚合函數對列進行統計的語法,希望對大家有幫助


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM