关于LINQ中实现随机查询数据库中记录+

传统使用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();

你可能感兴趣的:(sql,c,数据库,function,工具,LINQ)