繁体   English   中英

如何将多个count()语句合并为一个语句

[英]How can I join multiple count() statements into a single statement

我有一个名为Resources的表,它有一个名为resourceType的字段。 我需要检索每种资源类型的计数。 目前,我正在使用实体框架在asp.net mvc中执行以下操作:

string[] notservers = new string[] { "vmware virtual platform", "storage device", "router", "switch", "firewall" };
string[] types = new String[] { "server", "workstation" };
IT360ServerNo =     entities.Resources
            .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && (a.SystemInfo.ISSERVER == true ) && !(notservers.Contains(a.SystemInfo.MODEL.Trim().ToLower()))).Count(),
IT360VMNo = entities.Resources
            .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && (a.SystemInfo.ISSERVER == true) && a.SystemInfo.MODEL.Trim().Equals("VMware Virtual Platform", StringComparison.OrdinalIgnoreCase)).Count(),
IT360SDNo = entities.Resources
           .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && a.SystemInfo.MODEL.Trim().Equals("Storage Device", StringComparison.OrdinalIgnoreCase)).Count(),
IT360SwitchNo = entities.Resources
            .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && a.SystemInfo.MODEL.Trim().Equals("Switch", StringComparison.OrdinalIgnoreCase)).Count(),
IT360FirewallNo = entities.Resources
           .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && a.SystemInfo.MODEL.Trim().Equals("Firewall", StringComparison.OrdinalIgnoreCase)).Count(),
IT360RouterNo = entities.Resources
           .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && a.SystemInfo.MODEL.Trim().Equals("Router", StringComparison.OrdinalIgnoreCase)).Count(),

我的视图模型类,如下所示:

public class SystemInformation
    {

        [Display(Name = "Server/s")]
        public int IT360ServerNo { get; set; }
        [Display(Name = "VM/s")]
        public int IT360VMNo { get; set; }
        [Display(Name = "SD/s")]
        public int IT360SDNo { get; set; }
        [Display(Name = "Switch/s")]
        public int IT360SwitchNo { get; set; }
        [Display(Name = "Firewall/s")]
        public int IT360FirewallNo { get; set; }
        [Display(Name = "Router/s")]
        public int IT360RouterNo { get; set; }

    } 

但是我的代码将向数据库发送6个请求,以分别检索每种类型的计数。 那么有没有办法写一条语句使Resource表根据类型分组并为每种类型检索Count()? 谢谢

编辑:-这就是我填充模型类的方式:-

public SystemInformation GetSystemInfo(int pagesize) 

        {
            var d = DateTime.Today;
            string[] notservers = new string[] { "vmware virtual platform", "storage device", "router", "switch", "firewall" };
            string[] types = new String[] { "server", "workstation" };

            var tmpCustomCount = tms.CustomAssets.Sum(a => (int?)a.Quantity);
            SystemInformation s = new SystemInformation()
            {

            AssetCount = new AssetCount() {

                CustomerCount = entities.AccountDefinitions.Count(),
                RackCount = tms.TMSRacks.Count(),
                ServerCount =  tms.TMSServers.Count(),
                VirtualMachineCount =  tms.TMSVirtualMachines.Count(),
                StorageDeviceCount =  tms.TMSStorageDevices.Count(),
                FirewallCount = tms.TMSFirewalls.Count(),
                SwitchCount =  tms.TMSSwitches.Count(),
                RouterCount =  tms.TMsRouters.Count(),
                DataCenterCount =  tms.DataCenters.Count(),
                CustomCount = tmpCustomCount == null ? 0 : tmpCustomCount.Value
                //tms.CustomAssets==null? 0 : tms.CustomAssets.Sum(a => a.Quantity)

            },

           AdminAudit = AllIncludingAdminAudit("", auditinfo => auditinfo.SecurityTaskType, auditinfo2 => auditinfo2.AuditAction).OrderByDescending(a => a.DateTimeStart)
           .Take(pagesize).ToList(),
           LatestTechnology = tms.Technologies.Where(a=> !a.IsDeleted && a.IsCompleted).OrderByDescending(a => a.TechnologyID).Take(pagesize).ToList(),
           IT360ServerNo =     entities.Resources
            .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && (a.SystemInfo.ISSERVER == true ) && !(notservers.Contains(a.SystemInfo.MODEL.Trim().ToLower()))).Count(),
            IT360VMNo = entities.Resources
            .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && (a.SystemInfo.ISSERVER == true) && a.SystemInfo.MODEL.Trim().Equals("VMware Virtual Platform", StringComparison.OrdinalIgnoreCase)).Count(),
            IT360SDNo = entities.Resources
           .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && a.SystemInfo.MODEL.Trim().Equals("Storage Device", StringComparison.OrdinalIgnoreCase)).Count(),
            IT360SwitchNo = entities.Resources
            .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && a.SystemInfo.MODEL.Trim().Equals("Switch", StringComparison.OrdinalIgnoreCase)).Count(),
            IT360FirewallNo = entities.Resources
           .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && a.SystemInfo.MODEL.Trim().Equals("Firewall", StringComparison.OrdinalIgnoreCase)).Count(),
            IT360RouterNo = entities.Resources
           .Where(a => String.IsNullOrEmpty(a.ASSETTAG) && a.SystemInfo.MODEL.Trim().Equals("Router", StringComparison.OrdinalIgnoreCase)).Count(),

            DeleteNo = tms.TechnologyAudits.Where(a => ( EntityFunctions.TruncateTime(a.DateTimeEnd) == d && a.AuditAction.Name.ToLower() == "delete" && a.TechnologyID != null)).Count(),//TechnologyId != null so that only assets that have tags will be included in the count
            CreateNo = tms.TechnologyAudits.Where(a => (EntityFunctions.TruncateTime(a.DateTimeEnd) == d && a.AuditAction.Name.ToLower() == "add" && a.TechnologyID != null)).Count(),
            EditNo = tms.TechnologyAudits.Where(a => (EntityFunctions.TruncateTime(a.DateTimeEnd) == d && a.AuditAction.Name.ToLower() == "Edit" && a.TechnologyID != null)).Count(),
            OtherNo = tms.TechnologyAudits.Where(a => (EntityFunctions.TruncateTime(a.DateTimeEnd) == d 
                && 
               !((a.AuditAction.Name.ToLower() == "delete" && a.TechnologyID != null) 
               || (a.AuditAction.Name.ToLower() == "add" && a.TechnologyID != null) 
               || (a.AuditAction.Name.ToLower() == "edit" && a.TechnologyID != null)))).Count(),


            };
            return s;

你可以用let语句来做

var systemInformation = (from r in entities.Resources
                         let serverNos = r.Where(a => String.IsNullOrEmpty(a.ASSETTAG) && (a.SystemInfo.ISSERVER == true ) && !(notservers.Contains(a.SystemInfo.MODEL.Trim().ToLower())))
                         let vmnos = r.[...]
                         select new SystemInformation 
                                    {
                                        IT360ServerNo = serverNos.Count(),
                                        IT360VMNo = vmnos.Count(),
                                        [...]
                                    }).First();
var assets = entities.Resources.Where(a => String.IsNullOrEmpty(a.ASSETTAG)).ToList()

然后使用资产。在此...将导致一个查询。 然后您的应用程序将对它们进行排序和计数,而不是对数据库进行计数...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM