2013-02-19 2 views
1

Учитывая следующую структуру базы данных и используя EntityFramework.Как определить, какие SQL-записи отсутствуют после запроса?

enter image description here

Каждые пять минут, «phasecount» таблица получает записи для каждой записи в «фазе».

using (Entities db = new Entities()) 
{ 
    db.ContextOptions.LazyLoadingEnabled = false; 

    int numberofcontrollers = (from a in db.Junctions select a).Count(); 
    List<int> controllerids = (from b in db.Junctions select b.Id).ToList(); 

    var configuration = (from c in db.Configurations select c).First(); 

    DateTime laststamp = (from s in db.Stamps select s.Time).Max(); 
    DateTime firststamp = laststamp.AddMinutes(-1 * (CountIntervalsBefore - 1) * TimeSliceLength); 

    var stamps = from s in db.Stamps.Include("PhaseCounts.Phase") where s.Time >= firststamp && s.Time <= laststamp orderby s.Id select s; 
    // check consistency; number of stamps should equal timeslices*controllers 

    if (stamps.Count() != CountIntervalsBefore * numberofcontrollers) 
    { 
     //counts are not available for all timeslices and controllers 
     //do extended consistency check (and use dummy data?) 
    } 
} 

Я хочу выбрать один час для каждой фазы для всех фаз.

Марки обычно равны 72, т.е. 12 5-минутных ломтиков * 6 соединений.

Если он не равен 72, как определить, какие фазы и какие метки имеют отсутствующие данные?

ответ

0

Мои первые мысли о решении; это может быть не оптимальный метод поиска, но он должен работать.

Возьмите самую раннюю временную метку в группе и убедитесь, что у вас действительно есть правильное количество записей с этой меткой времени (из того, что вы сказали, я считаю, что это 6). Из этого вы можете узнать, отсутствуют ли какие-либо из этого набора. Затем найдите ближайшую временную метку к текущей. Если это значительно больше, чем около пяти минут, у вас не хватит целого набора. Если это около пяти минут, убедитесь, что у вас есть правильное количество записей с этой меткой времени, например, с первым набором. Повторяйте до тех пор, пока не будет (либо общее количество отсутствующих записей + всего найдено записей = 72), либо закончите записи. Если вы дойдете до конца записей, и у вас все еще есть недостающие, то самая ранняя метка времени не была первой, и у вас есть полный набор, отсутствующий там. На данный момент либо (общее количество отсутствующих записей + общее количество найденных записей = 72), либо что-то пошло не так.

+0

Спасибо. Я надеялся сделать это с некоторыми умными объединениями в запросе, но до сих пор я не могу узнать, как ... – Cornelis