2016-11-06 5 views
0

Я использую ServiceStack.ORMLite и SQLite как базу данных. Я создал общий репозиторий:Вызов функции sqlite через ServiceStack.ORMLite

public class Repository<T> : IRepository<T> where T : class, new() 
{ 
    private ReestrContext db; 

    public Repository(ReestrContext db) 
    { 
     this.db = db; 
    } 

    public long CountAll() 
    { 
     return db.Connection.Count<T>(); 
    } 

    public IQueryable<T> GetAll() 
    { 
     return db.Connection.SelectLazy(db.Connection.From<T>().Limit()).AsQueryable(); 
    } 

    public IQueryable<T> GetAll(int rows) 
    { 
     return db.Connection.SelectLazy(db.Connection.From<T>().Limit(rows)).AsQueryable(); 
    } 

    public IQueryable<T> GetAll(int? skip, int? rows) 
    { 
     return db.Connection.SelectLazy(db.Connection.From<T>().Limit(skip, rows)).AsQueryable(); 
    } 

    public T GetById(long id) 
    { 
     return db.Connection.LoadSingleById<T>(id); 
    } 

    public long CountByCondition(Expression<Func<T, bool>> predicate) 
    { 
     long res = db.Connection.Count<T>(predicate); 
     string qry = db.Connection.GetLastSql(); 
     return db.Connection.Count(predicate); 
    } 

    public IQueryable<T> GetByCondition(Expression<Func<T, bool>> predicate) 
    { 
     return db.Connection.SelectLazy(db.Connection.From<T>().Where(predicate).Limit()).AsQueryable(); 
    } 

    public IQueryable<T> GetByCondition(Expression<Func<T, bool>> predicate, int rows) 
    { 
     return db.Connection.SelectLazy(db.Connection.From<T>().Where(predicate).Limit(rows)).AsQueryable(); 
    } 

    public IQueryable<T> GetByCondition(Expression<Func<T, bool>> predicate, int? skip, int? rows) 
    { 
     return db.Connection.SelectLazy(db.Connection.From<T>().Where(predicate).Limit(skip, rows)).AsQueryable(); 
    } 

    public long Create(T item) 
    { 
     using (var trans = db.Transaction) 
     { 
      long res = db.Connection.Insert(item, selectIdentity: true); 
      try 
      { 
       trans.Commit(); 
      } 
      catch 
      { 
       trans.Rollback(); 
      } 
      return res; 
     } 
    } 

    public T Update(T item) 
    { 
     using (var trans = db.Transaction) 
     { 
      db.Connection.Update(item); 
      try 
      { 
       trans.Commit(); 
      } 
      catch 
      { 
       trans.Rollback(); 
      } 
      return item; 
     } 
    } 

    public long Delete(long id) 
    { 
     using (var trans = db.Transaction) 
     { 
      long res = db.Connection.Delete(id); 
      try 
      { 
       trans.Commit(); 
      } 
      catch 
      { 
       trans.Rollback(); 
      } 
      return res; 
     } 
    } 
} 

На стороне клиента я создал функцию фильтра, которая возвращает дерево выражений. Но мой класс POCO имеет

[Alias("Bd")] 
[DataType(DataType.Date)] 
public Nullable<DateTime> BirthdaySingle { get; set; } 

Поле, которое также используется в условиях фильтра. Итак, я не могу найти решение правильно создать фильтр в этом поле (потому что дерево выражений не обрабатывает его), и я хочу знать, что может быть другим решением для достижения такой фильтрации. Поддерживает ли ORMLite вызов функций SQLite? В моем случае это должна быть функция DATE. Или, возможно, он использует System.ComponentModel.DataAnnotations пространство имен, чтобы установить атрибут [DataType(DataType.Date)] в поле строки. Я не знаю. Помоги мне, пожалуйста.

ответ

0

Похоже, что ваш код ссылается на дерево LINK Expression<T> вместо дерева SqlExpression<T> OrmLite. Они выглядят одинаково, но OrmLite поддерживает только преобразование lambdas в запросы.

Я бы рекомендовал поиграть в недавно выпущенном OrmLite Gistlyn sandbox, чтобы быстро проверить ваш код ORM.

+0

Спасибо за ссылку, я попробую. Но еще один вопрос. Выражение LINQ отлично работает, но не используется поле DateTime. А что касается многоуровневой архитектуры, мне нужно ссылаться на библиотеку OrmLite на уровне представления. Или мне нужно создать фильтр в другом слое? – Dmitry