Оптимизация кода C # для доступа к записям с данными - PullRequest
0 голосов
/ 05 октября 2009

У меня есть проблема с данными.И мне нужно заменить код на более умный.

У меня есть таблица данных, и примеры значений выглядят так:

Столбцы: id, user_id, время начала, время окончания

Пример строки: 1, 5, 05.10.2009 08: 00: 00,05.10.2009 17: 00

мой псевдокод:

    function something()
    {
    for(int i=0;i<datatable.Rows.Length;i++)
    {
    if(Someobject.variable.Equals(dt.Rows[i][user_id].ToString()))
    {
    if(Date.Compare(somevariable,dt.Rows[i][starttime].ToString())!=0)
    {
    //Do something
    }
    }
    }
}

это что-то вроде этого.Таблица данных содержит более тысячи строк, и при загрузке страницы asp.net функции должны вызываться почти тысячу раз.

Так что мне нужно ее изменить.

Я подумал об использовании словаря.но кажется, что требуется только две переменные.Что вы можете мне предложить.

Редактировать:

Я пока не могу решить проблему.Вот соответствующий код.Заранее спасибо.

Защищено void RadScheduler_Randevu_TimeSlotCreated (отправитель объекта, Telerik.Web.UI.TimeSlotCreatedEventArgs e) {

for (int i = 0; i < calismaSaatleridt.Rows.Count; i++)
{
    if (RadScheduler_Randevu.SelectedView.Equals(SchedulerViewType.DayView))
    {
        if (RadScheduler_Randevu.SelectedDate.ToShortDateString().Equals(Convert.ToDateTime(calismaSaatleridt.Rows[i]["calisma_baslangic"]).ToShortDateString()))
        {
            if (e.TimeSlot.Resource.Key.ToString().Equals(calismaSaatleridt.Rows[i]["hekim_id"].ToString()))
            {
                if (DateTime.Compare(e.TimeSlot.Start, Convert.ToDateTime(calismaSaatleridt.Rows[i]["calisma_baslangic"])) < 0 || DateTime.Compare(e.TimeSlot.End, Convert.ToDateTime(calismaSaatleridt.Rows[i]["calisma_bitis"])) > 0)
                {
                    e.TimeSlot.CssClass = "Disabled";
                }
            }
        }
    }
}

}

Эта функция возвращаетнабор результатов.

private DataTable calismaSaatiGetir(string yonetici_id)
    {
        SqlConnection connection = new SqlConnection();
        connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlCommand command = new SqlCommand();
        command.CommandText = "select calisma_saati.id,kullanici.id as hekim_id,LEFT(CONVERT(VARCHAR,calisma_saati.tarih,104),10)+ ' ' +LEFT(CONVERT(VARCHAR,calisma_saati.baslangic_saati,108),5) AS calisma_baslangic,LEFT(CONVERT(VARCHAR,calisma_saati.tarih,104),10)+ ' '+LEFT(CONVERT(VARCHAR,calisma_saati.bitis_saati,108),5) AS calisma_bitis from calisma_saati JOIN kullanici ON kullanici.id=calisma_saati.kullanici_id WHERE  yonetici_id='" +  Session["yonetici"].ToString() + "' ";
        command.Connection = connection;
        connection.Open();
        SqlDataAdapter da = new SqlDataAdapter(command.CommandText, connection);
        DataSet ds = new DataSet();
        da.Fill(ds, "calisma_saati");
        calismaSaatleridt = ds.Tables["calisma_saati"];
        connection.Close(); 
        return calismaSaatleridt;
    }

Ответы [ 3 ]

6 голосов
/ 05 октября 2009

В базе данных содержится более тысячи строк, и функции должны вызываться почти тысячу раз

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

лучший способ исправить это - на уровне базы данных: что бы вы ни делали для создания этого набора данных, необходимо знать о вашем другом наборе данных, чтобы вы могли принять его во внимание в базе данных (и использовать такие вещи, как индексы и кэшированные данные). Это может означать написание запроса на выборку, который намного сложнее, чем вы привыкли, но это правильный способ сделать это.

Если это просто не вариант, вы все равно хотите каким-то образом переделать это так, чтобы вы все продумали только один раз. Если вы используете c #, вы, вероятно, можете сделать это с помощью запроса linq (или даже просто с помощью методов IEnumerable extensions + lambda).

Что касается использования словаря: может потребоваться только две переменные, но одна из этих переменных может быть более сложным объектом, например, целым датаром из вашей таблицы. В любом случае, чтобы дать вам что-то вроде примера кода, нам нужно лучше понять, как выглядят эти данные и каков ваш ожидаемый результат.

1 голос
/ 05 октября 2009

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

Более определенный SQL: выберите * из таблицы, где userID = 'bob' и время начала между '01.01.2009 23:00' и '01.01.2009 23:21'

Linq:

DataTable table = getFromDb();
table.Rows.Cast<DataRow>().ToList().ForEach(x => RunMyFunction(x));

void RunMyFunction(DataRow row)
{

}
0 голосов
/ 05 октября 2009

как насчет этого? (было бы лучше, если бы вы могли отправить этот запрос в базу данных. но это будет быстрее, чем зацикливание каждой строки)

void something(DataTable dt, myobj Someobject, DateTime somevariable)
{
    string filterPattern = "user_id='{0}' AND starttime='{1}'";
    string filter = string.Format(filterPattern, 
                                  Someobject.variable, 
                                  somevariable);
    DataRow[] rows = dt.Select(filter);

    foreach (DataRow row in rows)
        DoSomething(row);
}
void DoSomething(DataRow row)
{
}
public class myobj
{
    public string variable { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...