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行。此答案可能在注释之前发布。你说得对,肯定还有别的事情发生。