网上搜到的的都不好使,关于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(); //这里不应该有实现。
}
}
------解决方案--------------------
按照我的写。
然后
db.Customers.OrderBy(x => db.Random()).Take(3)
------解决方案--------------------
按照你的第一个写法
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()