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 --------------------编程问答--------------------
这位很傻很天真 --------------------编程问答-------------------- 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的东西混淆了 --------------------编程问答--------------------
看上去差不多!用纯JAVA,可以节约写SQL的时间了! --------------------编程问答-------------------- --------------------编程问答-------------------- 来学习,顶一下。 --------------------编程问答--------------------
你在.NET开发下面用纯JAVA,神经~~~ --------------------编程问答-------------------- 来学习了。。 --------------------编程问答--------------------
补充:.NET技术 , 非技术区