C# 如何用c语言增强实体框架

C# 如何用c语言增强实体框架,c#,entity-framework,C#,Entity Framework,我不熟悉实体框架。我最近创建了一个数据库,然后添加了一个数据库模型,并开始用它编码。但是速度非常慢 以下是我的课程: public partial class AssetList { public int Id { get; set; } [Required] [StringLength(50)] public string Name { get; set; } [Required] [StringLength(50)] public

我不熟悉实体框架。我最近创建了一个数据库,然后添加了一个数据库模型,并开始用它编码。但是速度非常慢

以下是我的课程:

public partial class AssetList
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [Required]
    [StringLength(50)]
    public string Barcode { get; set; }

    public bool IsExist { get; set; }
}

private void btnLoad_Click(object sender, RoutedEventArgs e)
    {
        Stopwatch swTotal = null;

        #region ADO select command
        swTotal = Stopwatch.StartNew();

        DataView dv = new SQL().GetDV("select * from AssetLists");
        AssetList al = null;
        for (int i = 0; i < dv.Count; i++)
        {
            al = new AssetList();
            al.Id = int.Parse(dv[i]["Id"].ToString());
            al.Name = dv[i]["Name"].ToString();
            al.Barcode = dv[i]["Barcode"].ToString();
            al.IsExist = bool.Parse(dv[i]["IsExist"].ToString());

            dgAssetList.Items.Add(al);
        }

        swTotal.Stop();
        MessageBox.Show(string.Format("ADO select command time: {0:N4} seconds.", swTotal.Elapsed.TotalSeconds));
        #endregion


        #region Entity Framework
        swTotal = Stopwatch.StartNew();

        using (var db = new dbModelContext())
        {
            db.Configuration.ProxyCreationEnabled = false;

            //1
            //IQueryable<AssetList> QUERY = from a in db.AssetLists
            //            where a.Id == 1
            //            select a;

            //2
            //var QUERY = from a in db.AssetLists
            //            where a.Id == 1
            //            select a;

            //3
            var QUERY = db.AssetLists.Select(a => new { a.Id, a.Name, a.Barcode, a.IsExist });
            //.Where(a => a.Name.Contains("Asset"))
            //.Where(a => a.Id < 5);


            dgAssetList.ItemsSource = QUERY.ToList();
        }

        swTotal.Stop();
        MessageBox.Show(string.Format("Entity Framework time: {0:N4} seconds.", swTotal.Elapsed.TotalSeconds));

        #endregion
    }
留言如下:

ADO select命令时间:0/0663秒

实体框架时间:5/0479秒

每次重新启动应用程序时,实体框架时间都在减少。我的意思是,第一次超过5秒,之后变成3秒,然后变成2秒。我等了几分钟,然后启动了应用程序,现在又是3秒

我猜这种增加和减少是因为网络,但为什么ADO select命令时间总是在0/06秒左右,并且不会改变

dgAssetList是一个数据网格。我在谷歌上搜索了一些方法,但无法将其增强

有人知道我的代码出了什么问题吗?

ToList就是所谓的“急切操作”。在幕后,EF构建了一个查询,但在此类操作发生之前不会执行它

在您的例子中,您正在检索内存中的所有记录


在调用ToList之前,请考虑使用operations Skipnumber of records和Takenumber of records对结果进行分页。根据特定页码计算记录数的公式非常简单。

实体框架在第一次访问DbContext时会进行大量初始化。通过测试代码的外观和后面的注释确认,您正在测量第一个查询的性能

不要这样做,让EF在测量查询性能之前进行初始化。为此,实例化一个DbContext并进行一些无法缓存的查询,例如:

using (var db = new dbModelContext())
{    
   int dummy = db.AssetLists.Count();
   Console.WriteLine(dummy); // <-- make 100% sure this is not optimized away
}
然后测量您的查询


还有其他初始化方法,但确保它可以访问数据库并查询数据库是我的首选。表中有多少记录?在这里,您基本上要进行全选。你有没有确定EF确实是慢的?我们不知道EF是最快的,但简单的东西不应该花太长时间。@只凹凸6行4列。缓慢的数据库通常意味着错误的架构、缺少索引和/或错误的编码。另外,你说慢是什么意思?你是怎么测量的?为什么你认为这是EF的错?你说的慢是什么意思?@MostafaKhodakarami不会对第一个EF查询进行度量,除非你以前做过初始化。EF在第一次访问时进行了大量初始化。。。如果您想测量查询性能,请先初始化您的上下文,然后再进行简单的查询,然后再测量第二个:只是不要执行相同的查询,因为EF可以缓存它,但OP说他只获取6行。此答案可能在注释之前发布。你说得对,肯定还有别的事情发生。