2017-01-15 2 views
0

Я использую Entity Framework код первым, и я хочу, чтобы запросить таблицу назначений в моем выборе базы данных:SQL организаций - комплексный выбирающий запрос дата

  1. все назначения на указанных датах

    public IEnumerable<Appointment> GetAppointments(IEnumerable<DateTime> datesWithEverything) 
    { 
        using (OneClickContext context = new OneClickContext()) 
        { 
         var query = from e in context.AppointmentSet 
            where datesWithEverything.Contains(e.StartDate) 
            select e; 
         return query; 
        } 
    } 
    
  2. Мне также нужен только один назначение с любого другого дня, первым найдено для каждого дня, не включенного в указанные даты.

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

Возможно ли это получить доступ к базе данных один раз?

Любая помощь приветствуется.

+0

пожалуйста, поделитесь выборки данных и структуры таблицы для работы на –

ответ

0

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

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

public IEnumerable<DateTime> GetDatesWithAppointments() 
{ 
    using (OneClickContext context = new OneClickContext()) 
    { 
     var query = (from e in context.AppointmentSet 
        order by e.StartDate 
        select e.StartDate).Distinct(); 
     return query.ToList(); 
    } 
} 

Кроме того, это вопрос стиля, но переменный «запрос» не требуется, и вы можете просто:

return (from e in context.AppointmentSet 
     order by e.StartDate 
     select e.StartDate).Distinct().ToList(); 

Примечание ToList(). Выполнение Linq-запроса отложено до первого перечисления, и ваш контекст запроса объявляется в блоке использования. Вы должны выполнить запрос до того, как в этом случае выйдет блок использования.

При редактировании, поскольку вам требуется фактическое назначение, вы сможете получить то, что хотите, за одну поездку, используя объединение и группировку linq. Союз автоматически удалит любые повторяющиеся записи.

public IEnumerable<Appointment> GetAppointments(IEnumerable<DateTime> datesWithEverything) 
{ 
    using (OneClickContext context = new OneClickContext()) 
    { 
     var query = from e in context.AppointmentSet 
        where datesWithEverything.Contains(e.StartDate) 
        select e; 

     query = query.Union(from e in context.AppointmentSet 
          group e by DbFunctions.TruncateTime(e.StartDate) into grp 
          select grp.FirstOrDefault()); 

     return query.ToList(); 
    } 
} 
+0

я делаю на самом деле нужны данные назначение на эти другие даты. Если я получу даты, мне нужно создать поддельные встречи, чтобы связать их (MVVM). Мне было интересно, могу ли я сделать это с одной поездкой в ​​базу данных. –

+0

ОК, я отредактировал ответ, чтобы получить то, что вам нужно. – Dimitri

+0

Спасибо Димитрию за ваше время. К сожалению, поскольку я использую базу данных SQLite, APPLY Joins не поддерживается. –

Смежные вопросы