Linq 优化:使用电数据查询的最佳实践
{"title": "优化Linq:\n //用电数据\n var q1 = from a in GetIQueryable()\n join b in Db.GetIQueryable<Equipment_Info>() on a.EquipmentId equals b.Id into tmp1\n from bb in tmp1.DefaultIfEmpty()\n join c in Db.GetIQueryable<Equipment_Type>() on bb.EquipmentTypeId equals c.Id into tmp2\n from cc in tmp2.DefaultIfEmpty()\n join d in Db.GetIQueryable<Equipment_UsageAreaType>() on bb.EquipmentUsageAreaTypeId equals d.Id into tmp3\n from dd in tmp3.DefaultIfEmpty()\n join e in Db.GetIQueryable<Equipment_UseType>() on bb.EquipmentUseTypeId equals e.Id into tmp4\n from ee in tmp4.DefaultIfEmpty()\n where a.Deleted == false && bb.EnterpriseId == enterpriseId\n && bb.IsEnable == true && bb.Deleted == false\n && cc.IsEnable == true && cc.Deleted == false\n && dd.IsEnable == true && dd.Deleted == false\n && ee.IsEnable == true && ee.Deleted == false\n && a.RecordTime >= startTime && a.RecordTime <= endTime\n && cc.TypeName == EquipmentType.电表.ToString()\n select new\n {\n a.RecordTime, // 记录时间\n a.ThisPower, // 本次电量\n EquipmentID = bb.Id, // 设备ID\n bb.EquipmentName, // 设备名称\n TypeID = cc.Id, // 类型ID\n cc.TypeName, // 类型名称\n UsageAreaTypeID = dd.Id, // 区域ID\n dd.UsageAreaName, // 区域名称\n UseTypeID = ee.Id, // 功能ID\n ee.UseTypeName, // 功能名称\n ee.Sort // 功能排序\n };\n\n //整站总用电\n var q2 = q1.Where(p => p.TypeName == EquipmentType.电表.ToString()\n && p.UseTypeName == EquipmentUseType.总用电.ToString()\n && p.ThisPower > 0);\n\n //节省电量\n var q4 = q1.Where(p => p.TypeName == EquipmentType.电表.ToString()\n && p.UseTypeName == EquipmentUseType.使用发电.ToString()\n && p.ThisPower > 0);\n\n //区域用电\n var q3 = q1.Where(p => p.UseTypeName == EquipmentUseType.区域用电.ToString()\n && p.ThisPower > 0).OrderBy(p => p.Sort);内容:优化Linq代码可以采用以下方法:\n\n1. 使用方法链代替查询语法:将查询语法转换为方法链形式,可以提高代码的可读性和维护性。\n\n2. 将重复的条件提取出来:将重复的条件提取出来,避免重复编写。\n\n3. 使用索引器访问枚举值:将枚举值转换为字符串时,可以使用枚举的索引器来访问。\n\n4. 使用具体的类型替代ToString()方法:在比较字符串时,使用具体的类型替代ToString()方法,可以提高性能。\n\n根据以上优化方法,重写代码如下:\n\n//用电数据\nvar q1 = GetIQueryable()\n .Join(Db.GetIQueryable<Equipment_Info>(), a => a.EquipmentId, b => b.Id, (a, b) => new { a, b })\n .Join(Db.GetIQueryable<Equipment_Type>(), ab => ab.b.EquipmentTypeId, c => c.Id, (ab, c) => new { ab.a, ab.b, c })\n .Join(Db.GetIQueryable<Equipment_UsageAreaType>(), abc => abc.b.EquipmentUsageAreaTypeId, d => d.Id, (abc, d) => new { abc.a, abc.b, abc.c, d })\n .Join(Db.GetIQueryable<Equipment_UseType>(), abcd => abcd.b.EquipmentUseTypeId, e => e.Id, (abcd, e) => new { abcd.a, abcd.b, abcd.c, abcd.d, e })\n .Where(x => !x.a.Deleted && x.b.EnterpriseId == enterpriseId && x.b.IsEnable && !x.b.Deleted && x.c.IsEnable && !x.c.Deleted && x.d.IsEnable && !x.d.Deleted && x.e.IsEnable && !x.e.Deleted && x.a.RecordTime >= startTime && x.a.RecordTime <= endTime && x.c.TypeName == EquipmentType.电表)\n .Select(x => new\n {\n x.a.RecordTime,\n x.a.ThisPower,\n EquipmentID = x.b.Id,\n x.b.EquipmentName,\n TypeID = x.c.Id,\n x.c.TypeName,\n UsageAreaTypeID = x.d.Id,\n x.d.UsageAreaName,\n UseTypeID = x.e.Id,\n x.e.UseTypeName,\n x.e.Sort\n });\n\n//整站总用电\nvar q2 = q1.Where(x => x.TypeName == EquipmentType.电表 && x.UseTypeName == EquipmentUseType.总用电 && x.ThisPower > 0);\n\n//节省电量\nvar q4 = q1.Where(x => x.TypeName == EquipmentType.电表 && x.UseTypeName == EquipmentUseType.使用发电 && x.ThisPower > 0);\n\n//区域用电\nvar q3 = q1.Where(x => x.UseTypeName == EquipmentUseType.区域用电 && x.ThisPower > 0)\n .OrderBy(x => x.Sort);\n
原文地址: https://www.cveoy.top/t/topic/pqVt 著作权归作者所有。请勿转载和采集!