Объекты SQL C # VS2010: доступ к нескольким таблицам для получения отдельных данных?Foreach или Linq? - PullRequest
0 голосов
/ 26 апреля 2011

У меня небольшая база данных, для получения которой требуется несколько табличных запросов. Я написал вложенные циклы foreach, чтобы сделать это, но мне было интересно, если это слишком требовательно к памяти или есть более эффективный способ сделать это. Я видел некоторый linq-код для объединения таблиц, и это выглядит многообещающе, но сейчас foreach было легче понять. Стоит ли искать код linq для замены вложенных циклов foreach. Спасибо

student is this so sid is this.getId
enrolls - sid(k) -term(k) -year(k) -crn(k)
sections -term(k) -year(k) -crn(k) -cprefix -cno
courses -cprefix(k) -cno(k) -chours

// count up enrolled course hours
        decimal enrolledHours = 0;
        foreach (enroll e in ent.enrolls)
        {
            if (e.sid.ToString() == this.get_Id && e.term.ToString() == term &&
                    e.year.ToString() == year)   // find enrolls for student
            {
                foreach (section s in ent.sections)  // search for cno for crn
                {
                    if (s.crn == e.crn && s.term == e.term && s.year == e.year)
                    {
                        foreach (cours c in ent.courses)    // match section and course
                        {
                            if (c.cprefix == s.cprefix && c.cno == s.cno)
                            {
                                enrolledHours += (decimal)c.chours;
                                break;
                            }
                        }
                    }
                }
            }
        }

db table model

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Да, нет необходимости в циклах foreach.Слишком большая сложность, скачки в базе данных и общий беспорядок.

Создайте Модель данных сущности в Visual Studio для вашей базы данных, и EF сгенерирует навигационные свойства на основе стороннихключи, которые вы настроили в своей базе данных.

Это позволит вам правильно присоединиться к FK с помощью оператора Include.

0 голосов
/ 26 апреля 2011

Вы обязательно должны искать либо замену LINQ to Entities, либо хотя бы замену Entity SQL для этого кода.

Каждый раз, когда вы задаете запрос с помощью EF ObjectContext, а затем перечисляете запрос (например, выполняя foreach над ним или преобразовывая его в список с помощью ToList () и т. Д.), Вы будете отправлять другой запрос в базу данных. В вашем примере у вас есть 3 вложенных цикла foreach, поэтому вы отправляете в базу данных как минимум 3 разных запроса (и, возможно, больше, в зависимости от того, какие дочерние данные вы извлекаете вместе с основными запросами), когда вы можете отправьте только один запрос, содержащий соответствующие объединения между вашими таблицами, чтобы получить все данные за один раз. Ваш метод, по-видимому, также извлекает намного больше данных, чем вам, вероятно, нужно, потому что вы извлекаете все записи через цикл foreach, а затем эффективно объединяете / фильтруете все данные в памяти в вашем коде. Кроме того, если вы используете отложенную загрузку, возможно, вы отправляете дополнительные запросы для получения связанных данных. Вы можете получить эти данные в запросе, используя вызов Include(...), который может быть быстрее в зависимости от того, как используются результаты.

Если вы реализуете правильный запрос LINQ to Entities и не перечисляете его до тех пор, пока запрос не будет полностью указан, вы можете получить гораздо более производительный и эффективный запрос, поскольку EF будет смотреть на все, что делает ваш запрос, и сгенерирует полный оператор SQL для вас. Запрос будет выполнен только тогда, когда вы перечислите его в конце. Это бонус за отложенное выполнение, который вы автоматически получаете от LINQ.

Обратите внимание, что это в основном обобщения, но суть в том, что вам следует избегать извлечения больших наборов записей из базы данных и фильтрации в памяти, а также избегать перечисления EF-запроса, пока вы не узнаете, что он довольно завершен и готов к идти.

...