using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;

namespace SlnMesnac.Repository.service.@base
{
    public interface IBaseService<T> where T : class
    {
        /// <summary>
        /// 添加实体信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        bool Insert(T model);

        /// <summary>
        /// 批量添加实体集合
        /// </summary>
        /// <param name="lisT"></param>
        /// <returns></returns>
        bool Insert(List<T> lisT);

        /// <summary>
        /// 根据id 删除信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        bool DeleteById(object id);

        /// <summary>
        /// 根据实体删除信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        bool Delete(T model);

        /// <summary>
        /// 根据实体集合批量删除信息
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        bool Deletes(List<T> entitys);

        /// <summary>
        /// 根据实体更新信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        bool Update(T model);

        /// <summary>
        /// 批量更新实体集合信息
        /// </summary>
        /// <param name="entitys"></param>
        /// <returns></returns>
        bool Update(List<T> entitys);

        /// <summary>
        /// 根据Where条件更新实体信息
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="strWhere"></param>
        /// <returns></returns>
        bool Update(T entity, string strWhere);

        /// <summary>
        /// 根据实体更新指定列
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="lstColumns"></param>
        /// <param name="lstIgnoreColumns"></param>
        /// <param name="strWhere"></param>
        /// <returns></returns>
        bool Update(T entity, List<string> lstColumns = null, List<string> lstIgnoreColumns = null, string strWhere = "");

        /// <summary>
        /// 查询所有信息
        /// </summary>
        /// <returns></returns>
        List<T> Query();

        /// <summary>
        /// 根据Id查询实体
        /// </summary>
        /// <param name="objId"></param>
        /// <returns></returns>
        T Query(object objId);

        /// <summary>
        /// 根据表达式查询
        /// </summary>
        /// <param name="whereExpression"></param>
        /// <returns></returns>
        List<T> Query(Expression<Func<T, bool>> whereExpression);

        /// <summary>
        /// 根据表达式排序查询
        /// </summary>
        /// <param name="whereExpression">查询条件</param>
        /// <param name="orderByExpression">排序条件</param>
        /// <param name="isAsc">是否正序</param>
        /// <returns></returns>
        List<T> Query(Expression<Func<T, bool>> whereExpression, Expression<Func<T, object>> orderByExpression, bool isAsc = true);
    }
}
