2016-04-29 3 views
0

Я пытаюсь создать SQLITE запрос, как этот (первый подход):Почему использование предложения SQLITE where не работает?

 int count; 
     using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), DbPath)) 
      { 
      count = (from p in db.Table<TickRecord>() 
         where (p.TickStartDate.LocalDateTime >= start && p.TickEndtDate.LocalDateTime <= end) 
         select (int)p.DurationInSeconds).Sum(); 
      } 
     return count; 

При выполнении запроса аварии приложения на ИНЕКЕ.

я смог добиться этого, как этот (второй подход):

 ObservableCollection<TickRecord> records; 

     // Create a new connection 
     using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), DbPath)) 
      { 
      records = new ObservableCollection<TickRecord>(db.Table<TickRecord>().Select(i => i)); 
      } 

     int count = records.Where(record => record.TickStartDate.LocalDateTime >= start && record.TickEndDate.LocalDateTime <= end).Sum(record => record.DurationInSeconds); 

Есть ли способ добиться того же, используя мой первый подход?

Thx

+3

Какое исключение вы получали? – Michael

+1

Исключение брошено: 'System.NotSupportedException' в SQLite.Net.dll Доступ к членству не удалось скомпилировать выражение –

ответ

1

Вы не должны использовать доступ к элементу '.LocalDateTime' в запросе. Процессор Linq не может преобразовать '.LocalDateTime' в sqlite-запрос, просто потому, что в sqlite нет эквивалентной функции.

Как результат бросает исключение, как вам грустную:

[...] доступ к члену не удалось [...].

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

int count; 
using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), DbPath)) 
{ 
    var results = db.Table<TickRecord>().ToList(); 
    count = (from p in results 
       where (p.TickStartDate.LocalDateTime >= start && p.TickEndtDate.LocalDateTime <= end) 
       select (int)p.DurationInSeconds).Sum(); 
} 
return count; 
0

Модифицированный код за whymatter:

 int count; 
     using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), DbPath)) 
      { 
      count = (from p in db.Table<TickRecord>() 
         where (p.TickStartDate >= start && p.TickEndDate <= end) 
         select (int)p.DurationInSeconds).Sum(); 
      } 
     return count; 

Thx!

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