using Ant.Data;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace Ant.ORM
{
    /// <summary>
    /// 定义接口
    /// </summary>
    public interface IDbContext : IDisposable
    {
        //IDbSession CurrentSession { get; }
        /// <summary>
        /// 组装SQL语句
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        IQuery<T> Query<T>() where T : new();
        /// <summary>
        /// 自定义SQL语句
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        IEnumerable<T> SqlQuery<T>(string sql, params DbParam[] parameters) where T : new();
        /// <summary>
        /// 保存
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        T Insert<T>(T entity);
        /// <summary>
        /// 保存
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="body"></param>
        /// <returns>PrimaryKey</returns>
        object Insert<T>(Expression<Func<T>> body);
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        int Update<T>(T entity);
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="body"></param>
        /// <param name="condition"></param>
        /// <returns></returns>
        int Update<T>(Expression<Func<T, T>> body, Expression<Func<T, bool>> condition);
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        int Delete<T>(T entity);
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="condition"></param>
        /// <returns></returns>
        int Delete<T>(Expression<Func<T, bool>> condition);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="entity"></param>
        void TrackEntity(object entity);
    }
}