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语句

这其中涉及到了多表连接,以及使用聚合函数对列进行统计的语法,希望对大家有帮助

EF写统计的更多相关文章

  1. 只是一个用EF写的一个简单的分页方法而已

    只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...

  2. EF写in

    qualityStatisticsInfoSql.Where(t => successStateArray.Contains(t.UploadReportFlag)); 如果写成 quality ...

  3. EF写INNER JOIN 链接

    面对多表的查询,一般都是多表连接后下面再写条件,但是有一种写法可以提升一下EF生成的语句的效率 首先先去查询每一个表,把每一个表对应的条件附加上去,注意:过滤数据最多的条件放在首先位置 var lt ...

  4. EF写distinct

    在日常开发中常常是这么写的 var logErrorRequest = from l in _logErrorRepository.Table select new { WrongTime = l.W ...

  5. EF查询百万级数据的性能测试--多表连接复杂查询

    相关文章:EF查询百万级数据的性能测试--单表查询 一.起因  上次做的是EF百万级数据的单表查询,总结了一下,在200w以下的数据量的情况(Sql Server 2012),EF是可以使用,但是由于 ...

  6. 万字长文,带你彻底理解EF Core5的运行机制,让你成为团队中的EF Core专家

    在EF Core 5中,有很多方式可以窥察工作流程中发生的事情,并与该信息进行交互.这些功能点包括日志记录,拦截,事件处理程序和一些超酷的最新出现的调试功能.EF团队甚至从Entity Framewo ...

  7. SQL Server 统计信息更新时采样百分比对数据预估准确性的影响

    为什么要写统计信息 最近看到园子里有人写统计信息,楼主也来凑热闹. 话说经常做数据库的,尤其是做开发的或者优化的,统计信息造成的性能问题应该说是司空见惯. 当然解决办法也并非一成不变,“一招鲜吃遍天” ...

  8. C#EF中,使用类似于SQL中的% 模糊查询

    最近在做项目的时候需要使用到模糊查询,但是后台使用EF写的 而不是ADO或者是Dapper,如果是这样的话,我们就可以使用Sql语句直接进行模糊查询 现在我们需要在LINQ中使用类似于模糊查询 在EF ...

  9. EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET

    十年河东,十年河西,莫欺少年穷. EF就如同那个少年,ADO.NET则是一位壮年.毕竟ADO.NET出生在EF之前,而EF所走的路属于应用ADO.NET. 也就是说:你所写的LINQ查询,最后还是要转 ...

随机推荐

  1. GoWeb开发_Iris框架讲解(四):Iris框架设置操作

    路由组的使用 在实际开发中,我们通常都是按照模块进行开发,同一模块的不同接口url往往是最后的一级url不同,具有相同的前缀url.因此,我们期望在后台开发中,可以按照模块来进行处理我们的请求,对于这 ...

  2. Zjoi2011 看电影

    最近在学习一些概率的东西.. 一个随机试验称为 Laplace 试验,当且仅当它满足如下两个条件: (ⅰ) 试验结果 (样本点) 的个数是有限的.(Ω 是有限集) (ⅱ) 任意两个基本事件的概率均相等 ...

  3. 洛谷P1024 一元三次方程求解

    P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...

  4. 清除input框对浏览器保存的用户名和密码自动填充问题

    清除input框对浏览器保存的用户名和密码自动填充问题: type类型写如下写法,聚焦的时候type类型为“password” <input ng-model="getpwd" ...

  5. print和sys.stdout

    print print语句执行的操作是一个写操作,把我们从外设输入的数据写到了stdout流,并进行了一些特定的格式化.和文件方法不同,在执行打印操作是,不需要将对象转换为字符串(print已经帮我们 ...

  6. Duff and Meat(贪心)

    Duff is addicted to meat! Malek wants to keep her happy for n days. In order to be happy in i-th day ...

  7. context.xml

    <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF ...

  8. springBoot集成web service

    转载大神: https://blog.csdn.net/u011410529/article/details/68063541?winzoom=1 https://blog.csdn.net/nr00 ...

  9. Selenium----Selenium简单介绍以及Selenium IDE环境搭建,脚本录制

    1.selenium简单介绍 心得:作为一个新手开始了解这个工具,打算从录制脚本开始学习,“录制,看,学习,写”,总结网友说得打算先使用Selenium IDE录制学习,再使用Selenium RC开 ...

  10. Android子线程更新UI成功

    android子线程更新UI成功 今天在写demo的时候,在子线程中更新UI,发现更新成功,记录一下. protected void onCreate(Bundle savedInstanceStat ...