2016-11-06 3 views
0

J'utilise ServiceStack.ORMLite et SQLite comme base de données. J'ai créé un référentiel générique:Appel de la fonction sqlite via 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; 
     } 
    } 
} 

Du côté client, j'ai créé une fonction de filtre qui retourne un arbre d'expression. Mais ma classe POCO a

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

champ qui utilise également en condition de filtre. Donc, je ne trouve pas la solution pour créer correctement un filtre sur ce champ (parce que l'arbre d'expression ne le gère pas) et je veux savoir ce qui pourrait être une autre solution pour réaliser un tel filtrage. Est-ce que ORMLite prend en charge l'appel de fonctions SQLite? Dans mon cas, il doit être la fonction "DATE". Ou peut-être utilise-t-il l'espace de noms System.ComponentModel.DataAnnotations pour définir l'attribut [DataType(DataType.Date)] sur le champ de chaîne. Je ne sais pas. Aidez-moi s'il vous plaît.

Répondre

0

Il semble que votre code ait référencé l'arborescence Expression<T> de LINQ au lieu de l'arborescence SqlExpression<T> d'OrmLite. Ils se ressemblent, mais OrmLite n'a que le support pour transformer SqlExpression<T> lambdas en requêtes.

Je recommande de jouer dans le nouveau OrmLite Gistlyn sandbox pour tester rapidement votre code ORM.

+0

Merci pour le lien, je vais essayer. Mais une autre question. L'expression LINQ fonctionne correctement, mais pas si le champ DateTime est utilisé. Et qu'en est-il de l'architecture en couches, ai-je besoin de faire référence à la bibliothèque OrmLite dans la couche de présentation? Ou j'ai besoin de construire un filtre dans une autre couche? – Dmitry