日期:2014-05-20  浏览次数:20736 次

网上搜到的的都不好使,关于linq从数据库随机取出数据
网上搜到的方法有:
第一个:
在dbcontext里加上这个
[Function(Name = "NEWID", IsComposable = true)]
         public Guid NEWID() { return ((Guid)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))).ReturnValue)); }  

然后这么调用:
var iquer=  ( from a in new BackendDBContext().Categories orderby new dbcontext().NEWID() select a).Take(3);

我用了,直接报错,异常信息是【方法“System.Guid NEWID()”不支持转换为 SQL】

第二个:
var results=(from c in db.Customers orderby  Guid.NewGuid()
 select c).Take(10);

结果也是没用……

实在没得办法了,网上基本都是这两个方法,只好上来求助了
------解决方案--------------------
你是ef还是linq to sql?

当然,通用的做法
db.Customers.AsEnumerable().OrderBy(x => Guid.NewGuid()).Take(3) 绝对是可以的。
------解决方案--------------------
按照你的第一个写法

partial class MyDataContext {
     [Function(Name="NEWID", IsComposable=true)] 
     public Guid Random() 
     {
         throw new NotImplementedException();  //这里不应该有实现。
     }
}
------解决方案--------------------
引用:
Quote: 引用:

按照你的第一个写法

partial class MyDataContext {
     [Function(Name="NEWID", IsComposable=true)] 
     public Guid Random() 
     {
         throw new NotImplementedException();  //这里不应该有实现。
     }
}


……没有实现的话这方法又啥用?那该咋写?

按照我的写。

然后
db.Customers.OrderBy(x => db.Random()).Take(3)
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

按照你的第一个写法

partial class MyDataContext {
     [Function(Name="NEWID", IsComposable=true)] 
     public Guid Random() 
     {
         throw new NotImplementedException();  //这里不应该有实现。
     }
}


……没有实现的话这方法又啥用?那该咋写?

按照我的写。

然后
db.Customers.OrderBy(x => db.Random()).Take(3)


……在这个方法里抛出异常?那程序不是会直接出错吗……


不会,这个方法相当于一个占位符。
------解决方案--------------------
说白了就是给C#编译器产生一个MethodCall的表达式。

Linq to SQL Provider根据Attribute就会去执行SQL。这个方法本身不会执行。
------解决方案--------------------
使用ADO.NET随即找到一个ID,然后(如果喜欢LINQ Provider的话)可以使用所谓的LINQ读取。

请问谁跟你说过用了Linq Provider就不能使用Ado.net的呢?
------解决方案--------------------
效率更高?

直接

select top 10 xx,oo from table order by newid()