Dapper链接查询扩展

一对多映射关系

 /// <summary>
        /// 一对多连接查询
        /// </summary>
        /// <typeparam name="FirstT">主键表实体类型</typeparam>
        /// <typeparam name="SecondT">外键表实体类型</typeparam>
        /// <typeparam name="ReturnT">返回的实体类型(一般如果实体中存在映射关系的时候返回类型与主键表类型基本相同)</typeparam>
        /// <param name="sqlStr">连接查询的sql</param>
        /// <param name="ForeignKeyName">主键表实体中的的外键表集合名称</param>
        /// <param name="Name">外键表中的外键名</param>
        /// <returns></returns>
        public static List<FirstT> SelectOneToMore<FirstT, SecondT, ReturnT>(string sqlStr, string ForeignKeyName, string Name) where FirstT : IDataEntity, new()
        {
            using (var conn = ConnectionFactory.Connection)
            {
                List<FirstT> list = new List<FirstT>();
                var lookUp = new Dictionary<int, FirstT>();
                list = conn.Query<FirstT, SecondT, FirstT>(sqlStr,
                    (firstT, secondT) =>
                    {
                        FirstT t;
                        if (!lookUp.TryGetValue(firstT.ID, out t))
                        {
                            lookUp.Add(firstT.ID, t = firstT);
                        }
                        foreach (var item in firstT.GetType().GetProperties())
                        {
                            if (item.Name == ForeignKeyName)
                            {
                                var a = item.GetValue(firstT, null) as HashSet<SecondT>;
                                a.Add(secondT);
                            }
                        }
                        //t.GetType().GetMember(ForeignKeyName)
                        return firstT;
                    }, null, null, true, Name, null, null).ToList();

                return list;
            }

        }

一对一映射关系

 /// <summary>
        /// 一对一链接查询
        /// </summary>
        /// <typeparam name="FirstT">主键表类型</typeparam>
        /// <typeparam name="SecondT">外键表类型</typeparam>
        /// <typeparam name="ReturnT">返回值类型</typeparam>
        /// <param name="sqlStr">sql</param>
        /// <param name="ForeignKeyName">主键表实体中的的外键表集合名称</param>
        /// <param name="Name">外键表中的外键名</param>
        /// <returns></returns>
        public static List<FirstT> SelectOneToOne<FirstT, SecondT, ReturnT>(string sqlStr, string ForeignKeyName, string Name)
            where FirstT : IDataEntity, new()
            where SecondT : class,IDataEntity, new()
        {
            using (var conn = ConnectionFactory.Connection)
            {
                List<FirstT> list = new List<FirstT>();
                var lookUp = new Dictionary<int, FirstT>();
                list = conn.Query<FirstT, SecondT, FirstT>(sqlStr,
                    (firstT, secondT) =>
                    {
                        foreach (var item in firstT.GetType().GetProperties())
                        {
                            if (item.Name == ForeignKeyName)
                            {
                                item.SetValue(firstT, item.GetValue(firstT, null));
                            }
                        }
                        //t.GetType().GetMember(ForeignKeyName)
                        return firstT;
                    }, null, null, true, Name, null, null).ToList();

                return list;
            }

        }
时间: 2024-08-03 17:47:53

Dapper链接查询扩展的相关文章

Dapper 链式查询 扩展

Dapper 链式查询扩展 DapperSqlMaker   Github地址:https://github.com/mumumutou/DapperSqlMaker Demo: 查询       TestsDapperSqlMaker\DapperSqlMaker.Test\ SelectDapperSqlMakerTest.cs 添加       TestsDapperSqlMaker\DapperSqlMaker.Test\  InsertDapperSqlMakerTest.cs 更新 

[LINQ2Dapper]最完整Dapper To Linq扩展

此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper 需要先引用包Kogel.Dapper.Extension和Kogel.Dapper.Extension.MsSql(目前还支持Oracle),Nuget上可以下载安装. Model实体类 using Kogel.Dapper.Extension.Attributes; public class users    {        /// <

写了一个Windows API Viewer,提供VBA语句的导出功能。提供两万多个API的MSDN链接查询

世面上的API Viewer已经不少了,但给VBA用的几乎没有.我自己写了一个Windows API Viewer,提供VBA语句的导出功能,并可以提供两万多个API的MSDN链接查询. 环境需求:Windows 7.1 SP1及以上操作系统,安装.Net 4.5.2及以上框架. 下载地址:API Viewer v1.1 下载

应用程序框架实战二十四:基础查询扩展 - 分页与排序

上一篇介绍了IQueryable的Where方法存在的问题,并扩展了一个名为Filter的过滤方法,它是Where方法的增强版.本篇将介绍查询的另一个重要主题——分页与排序. 对于任何一个信息系统,查询都需要分页,因为不可能直接返回表中的所有数据. 如果直接使用原始的Ado.Net,我们可以编写一个通用分页存储过程来进行分页查询,然后通过一个DataTable返回给业务层.不过进入Entity Framework时代,分页变得异常简单,通过Skip和Take两个方法配合就可以完成任务. 为了让分

NHibernate Linq查询 扩展增强 (第九篇)

NHibernate Linq查询 扩展增强 (第九篇) 在上一篇的Linq to NHibernate的介绍当中,全部是namespace NHibernate命名空间中的IQueryOver<TRoot, TSubType>接口提供的.IQueryOver<TRoot, TSubType>这个借口实际上会被翻译成条件查询(Criteria Queries). 实际上Linq to NHibernate更加强大.我们先引入命名空间NHibernate.Linq,这里面有Linq

Cognos Report Studio 链接查询需要注意的地方2

在Report Studio里面用SQL设计报表,查询2,查询3 要链接一般按条件  a1=b1 在选择链接方式需要注意的地方: 默认链接 外部链接 需要设置打开FM,打开报表设计引用的数据包(FM-项目-编辑控制规则) 保存,重新发布模型包即可,(注意需要重新用RS打开报表刷新数据包后生效) Cognos Report Studio 链接查询需要注意的地方2

mysql全文索引(三)查询扩展

查询扩展原理: 开启查询扩展(query expansion)时候,进行两次查询,第一次,查出用户给定的关键词对应的记录:第二次,用第一次查出的结果里的关键词,再去查一次,把两次的结果返回给用户 实验 mysql> select id,title,body from articles where match(title,body) against('fulltext' ) order by id asc; +----+-------------------------+-------------

链接查询 变量

引用上一篇随笔的例子 一,链接查询 --查询人员表中的所有数据,并把bc换成文本,加上bceo; select code,name,sex,age,(select bname from bumen where bumen.bcode=renyuan.bc) as 部门,(select bceo from bumen where bumen.bcode=renyuan.bc) from renyuan --可以用链接查询(如下) select renyuan.code,name,sex,age,b

Hibernate SQLQuery简单实用,做链接查询

工单里面可能有0个告警,一个或多个告警,当工单中没有告警的时候也需要将工单显示出来,所以就需要使用工单和告警的做链接查询,下面是具体实例 表: CREATE TABLE `alarm` ( `id` bigint(20) NOT NULL DEFAULT '0', `title` varchar(20) DEFAULT NULL, `level` int(11) DEFAULT NULL, `customer_id` bigint(20) DEFAULT NULL, `work_sheet_id