用Linq To SQL 搭建底层

Posted Answer_せつな

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Linq To SQL 搭建底层相关的知识,希望对你有一定的参考价值。

用Linq To SQL 搭建底层

接口

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

namespace Project.DAL
{
    interface IBaseService<T> where T:class,new()
    {
        IQueryable<T> QueryAll(params Expression<Func<T, bool>>[] where);
        IQueryable<T> QueryAll<type>(Expression<Func<T, type>> order, bool isAsc = true, params Expression<Func<T, bool>>[] where);
        IQueryable<T> QueryAll<type>(out int total, int skip = 0, int take = 10, Expression<Func<T, type>> order = null, bool isAsc = true, params Expression<Func<T, bool>>[] where);
        void Insert(T t);
        void Insert(IEnumerable<T> t);
        void Delete(T t);
        void Delete(IEnumerable<T> t);
        bool SaveChange();
    }
}

底层

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

namespace Project.DAL
{
    public class BaseService<T> : IBaseService<T> where T : class, new()
    {
    //上下文对象
    Models.QuestionDBDataContext dbContext = new Models.QuestionDBDataContext();//直接复制会报错应先在Models里引入数据库

    private IQueryable<T> table = null;
    private IQueryable<T> GetTable()
    {
        if (table == null)
        {
            table = (IQueryable<T>)dbContext.GetTable<T>();
        }
        return table;
    }

    /// <summary>
    /// 查询
    /// </summary>
    /// <param name="where">查询条件</param>
    /// <returns></returns>
    public IQueryable<T> QueryAll(params Expression<Func<T, bool>>[] where)
    {
        IQueryable<T> iq = GetTable();
        if (where != null || where.Length < 1)
        {
            foreach (var item in where)
            {
                iq = iq.Where(item);
            }
        }
        return iq;
    }

    /// <summary>
    /// 排序
    /// </summary>
    /// <typeparam name="type">排序类型</typeparam>
    /// <param name="order">排序列</param>
    /// <param name="isAsc">升序or降序</param>
    /// <param name="where"></param>
    /// <returns></returns>
    public IQueryable<T> QueryAll<type>(Expression<Func<T, type>> order, bool isAsc = true, params Expression<Func<T, bool>>[] where)
    {
        var iq = QueryAll(where);
        if (isAsc)
        {
            iq = iq.OrderBy(order);
        }
        else
        {
            iq = iq.OrderByDescending(order);
        }
        return iq;
    }

    /// <summary>
    /// 分页查询
    /// </summary>
    /// <typeparam name="type"></typeparam>
    /// <param name="total">总数据数</param>
    /// <param name="skip">跳过n条</param>
    /// <param name="take">取n条(一页显示几条)</param>
    /// <param name="order"></param>
    /// <param name="isAsc"></param>
    /// <param name="where"></param>
    /// <returns></returns>
    public IQueryable<T> QueryAll<type>(out int total, int skip = 0, int take = 10, Expression<Func<T, type>> order = null, bool isAsc = true, params Expression<Func<T, bool>>[] where)
    {
        var iq = QueryAll<type>(order, isAsc, where);
        total = iq.Count();
        return iq.Skip(skip).Take(take);
    }

    public void Insert(T t)
    {
        dbContext.GetTable<T>().InsertOnSubmit(t);
    }

    public void Insert(IEnumerable<T> t)
    {
        dbContext.GetTable<T>().InsertAllOnSubmit(t);
    }

    public void Delete(T t)
    {
        dbContext.GetTable<T>().DeleteOnSubmit(t);
    }

    public void Delete(IEnumerable<T> t)
    {
        dbContext.GetTable<T>().DeleteAllOnSubmit(t);
    }

    /// <summary>
    /// 保存修改
    /// </summary>
    /// <returns></returns>
    public bool SaveChange()
    {
        try
        {
            dbContext.SubmitChanges();
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
}

}

以上是关于用Linq To SQL 搭建底层的主要内容,如果未能解决你的问题,请参考以下文章

用 LINQ to SQL 或 LINQ to EF 替换 NHibernate

如何在代码中定义/更改 Linq To Sql 的映射

如何改进 Linq-To-Sql 代码

Linq To Sql 使用初探

LINQ to XML - 从文件加载 XML 片段

用linq to sql 把这个sql语句写出来,感激不尽