Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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# int和long重载会导致性能损失_C#_.net_Performance_Entity Framework_Entity - Fatal编程技术网

C# int和long重载会导致性能损失

C# int和long重载会导致性能损失,c#,.net,performance,entity-framework,entity,C#,.net,Performance,Entity Framework,Entity,问题: public class API { DataAccessClass _dataAccess = new DataAccessClass(); public List<Items> GetById(int id) { return _dataAccess.Get(id); } protected internal class DataAccessClass { protected intern

问题:

public class API
{
    DataAccessClass _dataAccess = new DataAccessClass();

    public List<Items> GetById(int id)
    {
        return _dataAccess.Get(id);
    }

    protected internal class DataAccessClass
    {
        protected internal List<Items> GetByInt(int id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
        protected internal List<Items> GetByLong(long id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
    }
}
当实体中的直接数据访问需要时,为什么将列表从受保护的内部类传递到API方法,然后返回到我的UI需要4秒钟?这是因为列表实际通过这些方法传递吗

背景:

public class API
{
    DataAccessClass _dataAccess = new DataAccessClass();

    public List<Items> GetById(int id)
    {
        return _dataAccess.Get(id);
    }

    protected internal class DataAccessClass
    {
        protected internal List<Items> GetByInt(int id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
        protected internal List<Items> GetByLong(long id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
    }
}
我希望创建一个“API”层,它位于使用实体框架的数据访问层和UI层之间。这样做的目的是限制对CRUD操作的访问,并通过API强制执行所有操作,但我注意到性能非常糟糕

当我在这里使用我的类结构时,本例中的get方法需要4秒运行:

public class API
{
    DataAccessClass _dataAccess = new DataAccessClass();

    public List<Items> GetById(int id)
    {
        return _dataAccess.Get(id);
    }

    protected internal class DataAccessClass
    {
        protected internal List<Items> GET(int id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
        protected internal List<Items> GET(long id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
    }
}
编辑:


当我排除API的数据访问部分(即受保护的内部部分)并直接在API中运行using语句(仅删除受保护的内部部分)时,我得到了可接受的0.4秒

为了解决我的性能问题,我从上面的GET类中删除了重载。

public class API
{
    DataAccessClass _dataAccess = new DataAccessClass();

    public List<Items> GetById(int id)
    {
        return _dataAccess.Get(id);
    }

    protected internal class DataAccessClass
    {
        protected internal List<Items> GetByInt(int id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
        protected internal List<Items> GetByLong(long id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
    }
}
我的性能问题与最初的问题不同,最初的问题是通过更改两个get方法(一个使用int,一个使用long)的方法名来解决的。不确定这些重载为何会导致问题,但通过删除重载并直接指定名称,我的性能问题得到了解决

我的工人阶级看起来像:

public class API
{
    DataAccessClass _dataAccess = new DataAccessClass();

    public List<Items> GetById(int id)
    {
        return _dataAccess.Get(id);
    }

    protected internal class DataAccessClass
    {
        protected internal List<Items> GetByInt(int id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
        protected internal List<Items> GetByLong(long id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
    }
}
公共类API
{
DataAccessClass_dataAccess=新的DataAccessClass();
公共列表GetById(int-id)
{
return\u dataAccess.Get(id);
}
受保护的内部类DataAccessClass
{
受保护的内部列表GetByInt(int id)
{ 
使用(var-context=dbcontext)
{
返回context.GetItems();
}
}
受保护的内部列表GetByLong(长id)
{ 
使用(var-context=dbcontext)
{
返回context.GetItems();
}
}
}
}

除非我们能够重现您所看到的,否则这将很难回答。你的传球名单有多大?一般来说,虽然列表主要是通过引用传递的,所以它不重要。您的数据访问类看起来像什么?上面列出了数据访问类。。。这是受保护的内部部分。除此之外,它直接使用entitycontext.object.tolist()使用实体;数据集很小。平均4-6条记录。唯一不同的是,我可以直接在UI中使用“数据访问”代码,问题就消失了。哦,好吧,没有看到那个类,这很奇怪,
受保护的内部类
。什么是
GetItem()
?显然,4-6条记录不需要4秒钟。但现在我无法重现你所看到的。我在“编辑”下更新了我的主要帖子。也许这会有帮助。get项等效于:EntityContext.ObjectName.ToList();由于代码在受保护的内部类之外运行良好,因此我没有提到这方面的细节,因此我认为这与此无关。为什么您的方法
GetByInt()
GetByLong()
(以及以前的重载)都有
id
参数?他们没有使用它。如果他们正在使用它,C#会在许多地方应用数字类型之间的自动转换。也许您的性能问题与此有关?在生产中,我使用id只是不用于提供的示例。我现在假设它与此有关,因为只要我从编译器中删除“猜测工作”,它就可以正常工作。