Linq 如何 Extend\Override 现有的 toList() 方法
Linq how to Extend\Override existing toList() Method
我正在使用 Linq Sql。我想在调用 (System.Linq) toList() 方法时打开事务范围。因此,我试图通过创建自定义扩展 class 来覆盖默认的 toList() 方法,从而创建新版本的 toList()。但是在自定义 toList() 扩展中,我想调用现有的默认 (system.linq) ToList() 方法。但我不能那样做。请看下面的例子:
代码:
public static int GetRecordsWithNoChangeToQuery()
{
string connection = ConfigurationManager.ConnectionStrings["EventConn"].ConnectionString;
using (var ctx = new EventsDataContext(connection))
{
var records = (from m in ctx.Event select m).ToList(); //calling custom extension method
return records.Count();
}
}
LinqExtenionHeler
public static class LinqExtension
{
public static TransactionScope CreateLockTransaction()
{
var options = new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
};
return new TransactionScope(TransactionScopeOption.Required, options);
}
//custom extension method
public static List<T> ToList<T>(this IEnumerable<T> query)
{
using (TransactionScope ts = CreateLockTransaction())
{
return query.ToList(); //fails, not able to call system.linq .toList method
}
}
}
在上面的代码中,当我调用 query.ToList() 时,它会抛出错误。因为,它正在尝试调用 itself.So 如何从同名自定义扩展方法调用默认 (syste.linq) query.toList()?
扩展方法只是调用 public 静态方法的一种奇特方式。您仍然可以按正常方式调用它,有时您必须这样做。
return System.Linq.Enumerable.ToList(query);
不过,我确实支持尖叫的评论 "wait, why are you doing this?"。这似乎是解决此问题的次优方法。也许你应该问一个关于你的问题的更开放的问题,以获得更好的全球问题答案,这只是解决你当地的语法问题。
您为 List 创建的扩展方法,它将在内部调用自身,因为查询类型是 IEnumerable,这将通过异常或可能处于死锁状态。
因此,对于 ToList 扩展方法,您可以做一件事,即传递参数可以是 IQueryable。
所以语法为-
public static List<T> ToList<T>(此 IQueryable<T> 查询)<br>
{ 使用 (TransactionScope ts = CreateNoLockTransaction()) { return query.AsEnumerable().ToList();
}
}
我正在使用 Linq Sql。我想在调用 (System.Linq) toList() 方法时打开事务范围。因此,我试图通过创建自定义扩展 class 来覆盖默认的 toList() 方法,从而创建新版本的 toList()。但是在自定义 toList() 扩展中,我想调用现有的默认 (system.linq) ToList() 方法。但我不能那样做。请看下面的例子:
代码:
public static int GetRecordsWithNoChangeToQuery()
{
string connection = ConfigurationManager.ConnectionStrings["EventConn"].ConnectionString;
using (var ctx = new EventsDataContext(connection))
{
var records = (from m in ctx.Event select m).ToList(); //calling custom extension method
return records.Count();
}
}
LinqExtenionHeler
public static class LinqExtension
{
public static TransactionScope CreateLockTransaction()
{
var options = new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
};
return new TransactionScope(TransactionScopeOption.Required, options);
}
//custom extension method
public static List<T> ToList<T>(this IEnumerable<T> query)
{
using (TransactionScope ts = CreateLockTransaction())
{
return query.ToList(); //fails, not able to call system.linq .toList method
}
}
}
在上面的代码中,当我调用 query.ToList() 时,它会抛出错误。因为,它正在尝试调用 itself.So 如何从同名自定义扩展方法调用默认 (syste.linq) query.toList()?
扩展方法只是调用 public 静态方法的一种奇特方式。您仍然可以按正常方式调用它,有时您必须这样做。
return System.Linq.Enumerable.ToList(query);
不过,我确实支持尖叫的评论 "wait, why are you doing this?"。这似乎是解决此问题的次优方法。也许你应该问一个关于你的问题的更开放的问题,以获得更好的全球问题答案,这只是解决你当地的语法问题。
您为 List 创建的扩展方法,它将在内部调用自身,因为查询类型是 IEnumerable,这将通过异常或可能处于死锁状态。 因此,对于 ToList 扩展方法,您可以做一件事,即传递参数可以是 IQueryable。 所以语法为-
public static List<T> ToList<T>(此 IQueryable<T> 查询)<br>
{ 使用 (TransactionScope ts = CreateNoLockTransaction()) { return query.AsEnumerable().ToList();
}
}