2016-11-06 4 views
0

데이터베이스로 ServiceStack.ORMLite 및 SQLite를 사용하고 있습니다.ServiceStack.ORMLite를 통해 sqlite 함수 호출

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 함수 호출을 지원합니까? 제 경우에는 "날짜"기능이 필요합니다. 또는 System.ComponentModel.DataAnnotations 네임 스페이스를 사용하여 문자열 필드에 [DataType(DataType.Date)] 속성을 설정할 수 있습니다. 나는 모른다. 도와주세요, 제발.

답변

0

코드가 OrmLite의 SqlExpression<T> 트리 대신 LINQ의 Expression<T> 트리를 참조한 것처럼 보입니다. 그것들은 비슷해 보이지만, OrmLite는 SqlExpression<T> 람다를 쿼리로 변환 할 수있는 지원 만 있습니다.

ORM 코드를 신속하게 테스트하기 위해 새로 출시 된 OrmLite Gistlyn sandbox에서 놀아 볼 것을 권합니다.

+0

링크 주셔서 감사합니다. 그러나 하나 더 질문. LINQ 식은 정상적으로 작동하지만 DateTime 필드가 사용되는 경우에는 작동하지 않습니다. 그리고 계층화 된 아키텍처의 경우, 프리젠 테이션 계층에서 OrmLite 라이브러리를 참조해야합니까? 아니면 다른 레이어에서 필터를 생성해야합니까? – Dmitry