2016-04-20 4 views
1

Я новичок в Entity Framework. Недавно я создал базу данных, а затем добавил модель базы данных и начал ее кодировать. Но это очень очень медленно.Как повысить Entity Framework с помощью C#

Вот мои классы:

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 выбрать время команды: 0/0663 секунды.

Срок действия Entity Framework: 5/0479 секунд.

Время Entity Framework уменьшается при каждом повторном запуске приложения. Я имею в виду, что в первый раз это было более 5 секунд, после этого стало 3, а затем было 2. Я подождал несколько минут, а затем я начал приложение, и это снова 3 секунды.

Я думаю, что это увеличение и уменьшение связано с сетью, но почему ADO select command time всегда составляет около 0/06 секунд и не изменится?

dgAssetList - это DataGrid. У меня были некоторые подходы, но я не мог его поднять.

Кто-нибудь знает, что не так с моими кодами?

+1

Сколько записей в таблице? Здесь вы в основном делаете выбор всех. Вы определили, что на самом деле EF работает медленно? EF, как известно, не самый быстрый, но что-то простое не должно занять много времени. – bump

+0

@bump Только 6 строк с 4 колонками. –

+0

Медленная база данных обычно означает плохую схему, отсутствующие индексы и/или плохое кодирование. Кроме того, что вы имеете в виду медленно? Как вы это измерили? Почему вы думаете, что это ошибка EF? –

ответ

1

Entity Framework делает много инициализации при первом подключении DbContext. По внешнему виду вашего тестового кода (и подтвержденного позже в комментариях) вы измеряете производительность первого запроса.

Не делайте этого, пусть EF инициализируется, прежде чем вы измеряете эффективность запросов. Для этого экземпляра DbContext и сделать некоторые запросы, которые не могут быть в кэше, например:

using (var db = new dbModelContext()) 
{  
    int dummy = db.AssetLists.Count(); 
    Console.WriteLine(dummy); // <-- make 100% sure this is not optimized away 
} 

А затем измерить ваши вопросы потом.

Есть и другие способы инициализации, но, чтобы убедиться, что он может получить доступ к базе данных, и запрос к ней в моем оппионе, предпочтительнее.

0

ToList() - это так называемая «нетерпеливая» операция. За кулисами EF создает запрос, но не выполняет его до тех пор, пока не произойдет такая операция.

В вашем случае вы извлекаете все записи в памяти.

Рассмотрите возможность подкачки результатов, используя операции Skip(number of records) и Take(number of records) перед вызовом ToList(). Формула для вычисления количества записей на основе определенного номера страницы довольно тривиальна.

+0

Но OP говорит, что он выбирает только 6 строк. – PhillipH

+0

Этот ответ, вероятно, был опубликован раньше комментария. Вы правы, определенно происходит что-то еще. – DrinkBird