当前位置:编程学习 > C#/ASP.NET >>

DMSLinq后台数据访问框架实现 c#

详情见文章
DMSLinq后台数据访问框架实现
利用LINQ语法写SQL语句
见简单例子,支持INNER JOIN写法.当然目前还是有些局限性的.
比如有些子查询没有做到..但可以用VIEW的方式去实现的,只要实现相关接口就OK了


select * from table1 as t0 where t0.column1=(select column2 from table2 as t2 

where t2.column2 like '%a%')
这种形式查询完全是可以用DMSLinq写出来的

但是如果是条件加上t2.column2=t1.column3这种情况就有问题了.目前还在想办法解决当中

像一般inner join,orderby,groupby,having都是实现的

--------------------编程问答-------------------- 最近在玩一个JAVA轻量级ORM——————JOOQ!!!

select语句:

SELECT * FROM BOOK
   WHERE PUBLISHED_IN = 2011
ORDER BY TITLE

普通SQL都可以写成纯JAVA的语句:
create.selectFrom(BOOK)
      .where(PUBLISHED_IN.equal(2011))
      .orderBy(TITLE)

insert update语句可以写成:
// 新建一条记录
TBookRecord book = create.newRecord(T_BOOK);
book.setTitle("My first book");
book.store();

// 更新
book.setPublishedIn(2010);
book.store();

// 删除
book.delete();

--------------------编程问答-------------------- JOOQ是外国的纯JAVA控做的,他们喜欢掌握自己的命运,把任何东西都转换成自己喜欢的纯JAVA,这点值得我们学习!!!

纯JAVA无敌了!!! --------------------编程问答-------------------- 在帖个复杂点的SQL和linq比较一下,哈哈哈!!

  SELECT FIRST_NAME, LAST_NAME, COUNT(*)
    FROM AUTHOR
    JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
   WHERE LANGUAGE = 'DE'
     AND PUBLISHED > '2008-01-01'
GROUP BY FIRST_NAME, LAST_NAME
  HAVING COUNT(*) > 5
ORDER BY LAST_NAME ASC NULLS FIRST
   LIMIT 2
  OFFSET 1
     FOR UPDATE
      OF FIRST_NAME, LAST_NAME

用JOOQ这么写:

create.select(FIRST_NAME, LAST_NAME, count())
      .from(AUTHOR)
      .join(BOOK).on(Author.ID.equal(Book.AUTHOR_ID))
      .where(LANGUAGE.equal("DE"))
      .and(PUBLISHED.greaterThan(parseDate("2008-01-01")))
      .groupBy(FIRST_NAME, LAST_NAME)
      .having(count().greaterThan(5))
      .orderBy(LAST_NAME.asc().nullsFirst())
      .limit(2)
      .offset(1)
      .forUpdate()
      .of(FIRST_NAME, LAST_NAME)

LZ,用linq怎么写呢???
--------------------编程问答-------------------- --------------------编程问答-------------------- 楼上的查询当然可以做到.. NULLS FIRST
  LIMIT 2
  OFFSET 1
  FOR UPDATE
  OF FIRST_NAME, LAST_NAME

这个好像MSSQL没有这种语法.所以没有做到... --------------------编程问答-------------------- 太小瞧DMSLinq了 --------------------编程问答-------------------- SELECT FIRST_NAME, LAST_NAME, COUNT(*)
  FROM AUTHOR
  JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
  WHERE LANGUAGE = 'DE'
  AND PUBLISHED > '2008-01-01'
GROUP BY FIRST_NAME, LAST_NAME
  HAVING COUNT(*) > 5
这个是可以做到的

我这里生成的语句是


SELECT [t2].[FIRST_NAME],[t2].[LAST_NAME], Count(*)  AS [COUNT]  FROM (
SELECT [t0].[FIRST_NAME],[t0].[LAST_NAME] FROM  AS [t0] 
INNER JOIN  AS [t1] ON
((([t0].[ID] = [t1].[AUTHOR_ID]) AND ([t1].[LANGUAGE] = 'DE')) 
AND ([t1].[PUBLISHED] > '2008/1/1 0:00:00'))
   ) [t2]  
Group By [t2].[FIRST_NAME],[t2].[LAST_NAME]
Having  Count(*)  > 5
Order By [t2].[LAST_NAME] DESC

不知道FIRST
  LIMIT 2
  OFFSET 1
  FOR UPDATE
  OF FIRST_NAME, LAST_NAME

这个是做什么用的..SQL好像没有这种语法吧,只有MySQL有这种语法吧.所以在此孤陋寡闻了,呵呵!

写法如下
   var ss = DMS.Create<AUTHOR>().Join(DMS.Create<BOOK>(),

                (x, y) => x.ID == y.AUTHOR_ID
                && y.LANGUAGE == "DE"
                && y.PUBLISHED > DateTime.Parse("2008-01-01"),

                (x, y) => new { x.FIRST_NAME, x.LAST_NAME })
                .GroupBy(q => q.GroupBy(q.FIRST_NAME, q.LAST_NAME))
                .Select(q => q.Columns(q.FIRST_NAME, q.LAST_NAME, q.CountAll().As("COUNT")))
                .OrderBy(q => q.OrderBy(q.LAST_NAME.Desc()))
                .Having(q => q.CountAll() > 5);
两个类是

public class AUTHOR : BaseEntity
    {
        public string FIRST_NAME { get; set; }
        public string LAST_NAME { get; set; }
        public int ID { get; set; }
    }
    public class BOOK : BaseEntity
    {
        public int AUTHOR_ID { get; set; }
        public string LANGUAGE { get; set; }
        public DateTime PUBLISHED { get; set; }
    }

见图:


提到连接查询,原则上可以无限次连接
但如果类似这种连接

select * from a
inner join b on a.id=b.id
inner join c on c.id=b.bid
只能支持3个实体,当然可以改进一下方法支持4个,5个,至于join类型,如left join 是可以自己选择的.


okgoood提的是JAVA的写法.而我现在用的是C#实现的. --------------------编程问答-------------------- 这都做不到。。那框架推出来。。不是被人口水吗?java之王越来越傻了。。本人用LINQ to entity,觉的它天下无敌。。。但是说出来。。怕别人骂装B --------------------编程问答--------------------
引用 8 楼  的回复:
这都做不到。。那框架推出来。。不是被人口水吗?java之王越来越傻了。。本人用LINQ to entity,觉的它天下无敌。。。但是说出来。。怕别人骂装B

这位很傻很天真 --------------------编程问答-------------------- linq tosql不是已经实现了linq语句到sql语句的转化了吗? --------------------编程问答-------------------- 有点类似于LINQ TO SQL ,不过LINQ TO SQL是要生成一个统一的文件的,当文件大到一定程度或者说分开生成到一定程度你就不好管控了,而DMSLinq是不用生成的,每个类也方便独立~.我想在大型项目中如果使用LINQ TO SQL是件很痛苦的事 --------------------编程问答-------------------- .net版的大牛都到哪儿去了?? --------------------编程问答-------------------- .net版的大牛们呢?!

有人来挑战Linq to SQL了!!!

DMSLinq都听过吗??!

我看都没听过!哈哈哈哈哈哈哈哈哈!
--------------------编程问答-------------------- 呵呵~我有说挑战吗?各有优点罢了~ --------------------编程问答-------------------- 支持纯JAVA…… --------------------编程问答-------------------- 这里好像不是JAVA专区吧~所以.NET的东西没必要和JAVA的东西混淆了 --------------------编程问答-------------------- 这里好像不是JAVA专区吧~所以.NET的东西没必要和JAVA的东西混淆了 --------------------编程问答--------------------
引用 17 楼  的回复:
这里好像不是JAVA专区吧~所以.NET的东西没必要和JAVA的东西混淆了

看上去差不多!用纯JAVA,可以节约写SQL的时间了! --------------------编程问答-------------------- --------------------编程问答-------------------- 来学习,顶一下。 --------------------编程问答--------------------
引用 18 楼  的回复:
引用 17 楼 的回复:

这里好像不是JAVA专区吧~所以.NET的东西没必要和JAVA的东西混淆了

看上去差不多!用纯JAVA,可以节约写SQL的时间了!


你在.NET开发下面用纯JAVA,神经~~~ --------------------编程问答-------------------- 来学习了。。 --------------------编程问答--------------------
补充:.NET技术 ,  非技术区
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,