传统使用sql命令行方式
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
SELECT
TOP
1
*
FROM
Customers
ORDER
BY
NEWID
()
--
随机取出一条记录,想取多条,则top n
当随着LINQ时代的来代,这一切就有点不太好用了
按照传统的思路,我们可以把LINQ查询式写为
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
var results
=
(from c
in
db.Customers orderby NEWID()
select c).Take(
10
);
//
具体数据条数由take来进行指定
问题出现了,在C#当中根本就没有提供NEWID()这个方法..
几经周折,终于发现了一个比较可行的方案,就是为其添加这个NEWID()方法
下面是实现方案
首先我们需要在系统自由生成的o/p mapping代码中添加这个方法
如果是用户自己编写的(或是工具生成的)o/p mapping代码也是同理.
这里我就说下我自己的.系统生成的LINQ To Sql类会产生三个文件.Northwind.cs,Northwind.dbml.layout,Northwind.designer.cs
我们要做的就是在Northwind.cs中去添加我们需要的方法NEWID()
这个方法的功能当然就是和数据库当中的NEWID()是功能一致的.
具体的方法法代码如下:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
public
partial
class
NorthwindDataContext
{
[Function(Name
=
"
NEWID
"
, IsComposable
=
true
)]
public
Guid NEWID()
{
return
((Guid)(
this
.ExecuteMethodCall(
this
, ((MethodInfo)(MethodInfo.GetCurrentMethod()))).ReturnValue));
}
//
后面的生成代码略..
}
重新生成,编写好这个,我们的访问实现就变的很容易了哈
其使用方式和传统访问原理一致
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
db
=
new
NorthwindDataContext();
var result
=
(from c
in
db.Customers orderby db.NEWID() select c).Take(
10
);
foreach
(var item
in
result)
Console.WriteLine(item.CompanyName);
Console.ReadLine();