Linq Asp.net оптимизация кода - PullRequest
3 голосов
/ 10 марта 2010

Я использую AdventureWorks в качестве базы данных, чтобы ознакомиться с интерфейсами linq и asp.net, и мне было интересно, кто-нибудь может взглянуть на мой код в C # и дать мне оптимизированный способ получения результатов при поиске изатем обновляется при отправке.

protected void btnSearch_Click(object sender, EventArgs e)
    {
        TestDataClassDataContext dc = new TestDataClassDataContext();
        Individual ind = new Individual();
        var q = from Individual in dc.Individuals
                where Individual.CustomerID == Convert.ToInt32(txtCustID.Text)
                select Individual;
        if (q.Count() > 0)
        {
            ind = q.First();
            Contact con = new Contact();
            var q2 = from Contact in dc.Contacts
                     where Contact.ContactID == ind.ContactID
                     select Contact;
            if (q2.Count() > 0)
            {
                con = q2.First();
                txtFname.Text = con.FirstName;
                txtLname.Text = con.LastName;
                txtMname.Text = con.MiddleName;
                txtPhone.Text = con.Phone;
                txtPword.Text = con.PasswordSalt;
                txtSuff.Text = con.Suffix;
                txtTitle.Text = con.Title;
                txtEmail.Text = con.EmailAddress;
                ddlEmailPromo.SelectedValue = con.EmailPromotion.ToString();

            }
        }
    }

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        TestDataClassDataContext dc = new TestDataClassDataContext();
        Individual ind = new Individual();
        var q = from Individual in dc.Individuals
                where Individual.CustomerID == Convert.ToInt32(txtCustID.Text)
                select Individual;
        if (q.Count() > 0)
        {
            ind = q.First();
            Contact con = new Contact();
            var q2 = from Contact in dc.Contacts
                     where Contact.ContactID == ind.ContactID
                     select Contact;
            if (q2.Count() > 0)
            {
                con = q2.First();
                con.FirstName = txtFname.Text;
                con.LastName = txtLname.Text;
                con.MiddleName = txtMname.Text;
                con.Phone = txtPhone.Text;
                con.PasswordSalt = txtPword.Text;
                con.Suffix = txtSuff.Text;
                con.Title = txtTitle.Text;
                con.EmailAddress = txtEmail.Text ;
                ddlEmailPromo.SelectedValue = con.EmailPromotion.ToString();

            }
        }

Ответы [ 5 ]

4 голосов
/ 10 марта 2010

В одном запросе:

TestDataClassDataContext dc = new TestDataClassDataContext();
var con = (from individual in dc.Individuals 
                 join contact in dc.Contacts on individual.ContactID equals contact .ContactID
                 where individual.CustomerID == Convert.ToInt32(txtCustID.Text)
                 select contact).FirstOrDefault();

if(con == null) return;

txtFname.Text = con.FirstName;
txtLname.Text = con.LastName;
txtMname.Text = con.MiddleName;
txtPhone.Text = con.Phone;
txtPword.Text = con.PasswordSalt;
txtSuff.Text = con.Suffix;
txtTitle.Text = con.Title;
txtEmail.Text = con.EmailAddress;
ddlEmailPromo.SelectedValue = con.EmailPromotion.ToString();

Используйте тот же запрос в функции отправки изменений!

1 голос
/ 10 марта 2010

Ответ Пьера-Люка точен. Возможно, стоит также упомянуть, что, поскольку метод btnSearch_Click выполняет чтение только из базы данных, нет необходимости в .net отслеживать изменения, как это происходит при обновлении или удалении, поэтому введите:

dc.ObjectTrackingEnabled = false;

прямо под инициализацией DataContext скажет .net просто открыть соединение для запроса на чтение, что может помочь при попытке оптимизировать ваш код. Больше информации здесь: http://www.sidarok.com/web/blog/content/2008/05/02/10-tips-to-improve-your-linq-to-sql-application-performance.html

0 голосов
/ 10 марта 2010

Также обратите внимание, что каждый вызов .Count () будет перечислять полный набор результатов, чтобы вернуть счет.

Вам нужен метод .Any (), который будет работать в постоянное время.

0 голосов
/ 10 марта 2010

1) Первый запуск приложения asp.net всегда занимает больше времени, чем просто обработка запроса.

2) Отладка, включенная в web.config, также замедляет работу приложения.

3) (Может быть, наиболее значимым) Давайте посмотрим ближе к вашему коду.

var q = from Individual in dc.Individuals
                where Individual.CustomerID == Convert.ToInt32(txtCustID.Text)
                select Individual;

q НЕ содержит объектов - это всего лишь запрос. Теперь посчитаем, сколько раз оно выполнено:

1. if (q.Count() > 0)

  1. ind = q.First();

  2. q2.Count() > 0

Как минимум 3 раза за запрос ваше соединение установлено, открыто и закрыто. Это требует времени. Старайтесь использовать свои ресурсы экономно.

Надеюсь, это поможет, Илья.

0 голосов
/ 10 марта 2010

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

Пример:

TestDataClassDataContext dc = new TestDataClassDataContext();
Individual individual = dc.Individuals.Where(a => a.CustomerID == Convert.ToInt32(txtCustID.Text).FirstOrDefault();

if(individual != null)
{
   Contact contact = individual.Contacts.FirstOrDefault();
   if(contact != null)
   {
       txtFname.Text = contact.FirstName;
   }
}
...