簡體   English   中英

通過ServiceStack.ORMLite調用sqlite函數

[英]Calling sqlite function via ServiceStack.ORMLite

我正在使用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函數? 就我而言,它需要是“ DATE”功能。 也許它使用System.ComponentModel.DataAnnotations命名空間在字符串字段上設置[DataType(DataType.Date)]屬性。 我不知道。 請幫幫我。

看起來您的代碼已引用LINQ的Expression<T>樹而不是OrmLite的SqlExpression<T>樹。 它們看起來很相似,但是OrmLite僅支持將SqlExpression<T> lambda轉換為查詢。

我建議您在新發行的OrmLite Gistlyn沙箱玩耍,以快速測試您的ORM代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM