我正在尝试实现一个LINQ-to-SQL扩展方法,它只会获得一个随机行。这是我的代码:
public static T RandomRow(this IQueryable<T> query)
{
Random rand = new Random();
int row = rand.Next(0, query.Count());
return query.Skip(row).First();
}
问题是,query.Count()和query.Skip()的错误为'方法的类型参数'...'无法从使用中推断出来。尝试明确指定类型参数'。如果我将T修改为特定对象,它可以正常工作,但对任何数据库对象使用此方法都很棒。
有什么想法吗?
答案 0 :(得分:4)
您的方法看起来应该是通用的:
// Note the <T> after the method name
public static T RandomRow<T>(this IQueryable<T> query)
要么是,要么把它放在通用类中。
您可能还想使用ElementAt
方法而不是Skip
/ First
。
编辑:正如CodeInChaos所指出的,您对Random
的使用也存在问题。有关详细信息,请参阅my article on random numbers。
答案 1 :(得分:0)
您还有另一个问题:每次调用此方法时都会创建Random
的新实例。这意味着如果你快速连续调用它会得到相同的结果,这会破坏封装。
您有几种方法可以避免此问题:
Random
的实例,并让调用代码管理其生命时间Random
实例的静态字段。您需要通过使用锁定或使用线程静态字段来处理线程安全性Random
设为实例字段。