Do the Right Thing Right.

   ::  ::  ::  ::  :: 管理 ::
  75 随笔 :: 0 文章 :: 86 评论 :: 0 引用

传统使用sql命令行方式

 

 

SELECT TOP 1 * FROM Customers ORDER BY NEWID()
--随机取出一条记录,想取多条,则top n

 

当随着LINQ时代的来代,这一切就有点不太好用了

按照传统的思路,我们可以把LINQ查询式写为

 

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.designer.cs中去添加我们需要的方法NEWID()

这个方法的功能当然就是和数据库当中的NEWID()是功能一致的.

具体的方法法代码如下:


[System.Data.Linq.Mapping.DatabaseAttribute(Name="Northwind")]
public partial class NorthwindDataContext : System.Data.Linq.DataContext
{
        
    
private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
        
//在自动生成的mapping code中添加
        [Function(Name = "NEWID", IsComposable = true)]
        
public Guid NEWID()
        {
            
return ((Guid)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))).ReturnValue));
        }
//后面的生成代码略..

 

重新生成,编写好这个,我们的访问实现就变的很容易了哈

其使用方式和传统访问原理一致

 

            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();

 

好了忙活了老半天,特贴出来希望朋友们少走弯路^_^

posted on 2008-08-01 11:22 杨标 阅读(2183) 评论(10) 编辑 收藏

评论

不错, 学习了
 回复 引用 查看   

#2楼 2008-08-01 13:10 S.Sams      
实现是实现了, 不过你改VS自动生成的代码, 回头一保存就没有啦.
其实是可以直接在 LinQ 里面实现 的.
 回复 引用 查看   

#3楼 2008-08-01 13:51 Gray Zhang      
@S.Sams
写到partial文件里不就好了
 回复 引用 查看   

#4楼 2008-08-01 14:24 symbol[未注册用户]
--引用--------------------------------------------------
S.Sams: 实现是实现了, 不过你改VS自动生成的代码, 回头一保存就没有啦.
其实是可以直接在 LinQ 里面实现 的.
--------------------------------------------------------
既然这位朋友有简单实用的方法那就大家分离呗
 回复 引用   

#5楼 2008-08-01 20:43 nh022[未注册用户]
其实可以将SQL中的所有系统函数利用这种方法实现在C#中的!!
呵呵,暗渡陈仓……
 回复 引用   

#6楼 2008-08-02 08:16 雅阁布      
up!!!!
 回复 引用 查看   

#7楼 2008-09-26 09:47 Michael Xu      
很好 学习了!!
 回复 引用 查看   

#8楼 2008-11-23 14:15 风海迷沙      
@S.Sams
那是如何实现的呢?为啥不讲出来?
 回复 引用 查看   

#9楼 2008-11-23 15:35 风海迷沙      
我现在使用的是.Skip(1到集合count之间的随机数).Take(1).First()的方法
 回复 引用 查看   

#10楼 2009-05-04 16:24 Ryan Boo      
支持一下。
 回复 引用 查看