Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不加载表的所有数据的情况下计算活动和非活动统计信息?_C#_Entity Framework_Linq - Fatal编程技术网

C# 如何在不加载表的所有数据的情况下计算活动和非活动统计信息?

C# 如何在不加载表的所有数据的情况下计算活动和非活动统计信息?,c#,entity-framework,linq,C#,Entity Framework,Linq,我有这个模型: public class Category { public int Id { get; set; } public string Name { get; set; } public Nullable<bool> IsActive { get; set; } } 是否可以在不加载所有类别数据,然后计算活动和非活动统计数据的情况下执行此操作???删除列表: var query = context.Category; var categories

我有这个模型:

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Nullable<bool> IsActive { get; set; }
}

是否可以在不加载所有类别数据,然后计算活动和非活动统计数据的情况下执行此操作???

删除
列表

var query = context.Category;
var categoriesStats = new
{
    active = query.Count(t => t.IsActive),
    inactive = query.Count(t => !t.IsActive),
};
在开始处使用
ToList()
执行查询,查询将是
select*from category
。如果没有它,您现在将得到两个查询:
select count(*)from category,其中isActive=1
,一个查询另一个查询。 虽然这会导致数据库返回两轮数据,但返回的数据量只是计数的
int
,而不是对象的所有记录

另一个选项是使用
GroupBy
,通过这种方式,只转到基础一次:

from c in context.Category
group c by ((c.IsActive ?? false) ? "Active" : "Inactive") into g
select new { State = g.Key, Amount = g.Count() }

删除
列表

var query = context.Category;
var categoriesStats = new
{
    active = query.Count(t => t.IsActive),
    inactive = query.Count(t => !t.IsActive),
};
在开始处使用
ToList()
执行查询,查询将是
select*from category
。如果没有它,您现在将得到两个查询:
select count(*)from category,其中isActive=1
,一个查询另一个查询。 虽然这会导致数据库返回两轮数据,但返回的数据量只是计数的
int
,而不是对象的所有记录

另一个选项是使用
GroupBy
,通过这种方式,只转到基础一次:

from c in context.Category
group c by ((c.IsActive ?? false) ? "Active" : "Inactive") into g
select new { State = g.Key, Amount = g.Count() }
  • 不要使用ToList,这将从数据库中具体化整个数据库集
  • 直接使用Count,不需要指定位置
  • 不要使用ToList,这将从数据库中具体化整个数据库集
  • 直接使用Count,不需要指定位置

  • 您可以在单个查询中执行此操作,如下所示:

    var counts = context
        .Category
        .GroupBy(t => t.IsActive ?? false).ToDictionary(
            g => g.Key
        ,   g => g.Count()
        );
    var res = new {
        Active = counts.ContainsKey(true) ? counts[true] : 0
    ,   Inactive = counts.ContainsKey(false) ? counts[false] : 0
    };
    

    与两次使用
    context.Category
    的方法不同,使用
    GroupBy
    的方法对数据库进行一次往返以同时获取两个计数。计数将在RDBMS端完成,因此您不需要将所有类别加载到内存中。

    您可以在单个查询中完成,如下所示:

    var counts = context
        .Category
        .GroupBy(t => t.IsActive ?? false).ToDictionary(
            g => g.Key
        ,   g => g.Count()
        );
    var res = new {
        Active = counts.ContainsKey(true) ? counts[true] : 0
    ,   Inactive = counts.ContainsKey(false) ? counts[false] : 0
    };
    

    与两次使用
    context.Category
    的方法不同,使用
    GroupBy
    的方法对数据库进行一次往返以同时获取两个计数。计数将在RDBMS端完成,因此您不需要将所有类别加载到内存中。

    与通常的多个聚合一样,您可以使用
    groupby
    constant技术通过单个数据库查询获得结果

    另外,如果使用
    Sum(条件?1:0)
    而不是
    Count(条件)
    (或
    Where(条件).Count()
    ),则可以获得更好的SQL转换


    与多个聚合一样,您可以使用
    groupby
    constant技术通过单个数据库查询获得结果

    另外,如果使用
    Sum(条件?1:0)
    而不是
    Count(条件)
    (或
    Where(条件).Count()
    ),则可以获得更好的SQL转换



    在数据库中进行操作在数据库中进行操作在数据库中进行操作因此,在这里,我将有两次往返到数据库,如果是我的话,我将有一次往返???@Learning-即使它将两次到数据库,传输的数据量只是传递所有对象的数量的一小部分,然后在内存中计算您所给予的这么多答案和最重要的书面解释给了我很多知识和更好的理解。谢谢你们,你们是制作如此美丽的图片的责任人。所以在这里,我将有两次往返数据库,如果是我的话,我将有一次往返???@学习-即使它将两次进入数据库的数量传输的数据只是传递所有对象然后计入内存的一小部分感谢你给出答案,最重要的是写解释,这给了我很多知识和更好的理解。非常感谢你们负责制作如此漂亮的图片。如果我查询,将会有一个一次往返数据库,如果您查询,将有多个2次往返数据库。如果我是,请纠正我wrong@Learning-你说得对。但是,返回所有记录比仅返回计数(单个记录)要昂贵得多。因此,如果您有1000条记录,那么您的查询将一次性返回所有1000条记录,而修改后的(上面的)查询将对数据库进行两次访问,以分别获得一条记录。以前的版本(1000条记录)执行起来要昂贵得多,因为结果的数量很重要。@Learning-尝试将其减少到一次行程可以被视为一种微观优化,这取决于每次DB命中的成本有多高。在这种情况下,它似乎相当便宜,但我/我们没有其他上下文来说明可能同时发生的其他事情。+1供您解释。每当我提出问题时,我都会从你们那里获得很多知识。感谢您提供的信息如果是我的查询,将有一次到数据库的往返,如果是您的查询,将有多个2往返数据库。如果我是,请纠正我wrong@Learning-你说得对。但是,返回所有记录比仅返回计数(单个记录)要昂贵得多。因此,如果您有1000条记录,那么您的查询将一次性返回所有1000条记录,而修改后的(上面的)查询将对数据库进行两次访问,以分别获得一条记录。以前的版本(1000条记录)执行起来要昂贵得多,因为结果的数量很重要。@Learning-尝试将其减少到一次行程可以被视为一种微观优化,这取决于每次DB命中的成本有多高。在这种情况下,它似乎相当便宜,但我/我们没有其他上下文,无法了解可能同时发生的其他事情。+1供您解释。每当我提出问题时,我都会从你们那里获得很多知识。感谢信息我喜欢这个,这是一个更聪明的方法sql@GiladGreen这家伙是编写linq查询的专家,我想这个查询应该是一篇文章