【发布时间】:2016-06-17 22:01:48
【问题描述】:
我正在使用 Linq to Sql。我想在调用 (System.Linq) toList() 方法时打开事务范围。因此,我试图通过创建自定义扩展类来覆盖默认的 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() 时,它会抛出错误。因为,它正在尝试调用自己。那么如何从同名自定义扩展方法调用默认(syste.linq)query.toList()?
【问题讨论】:
-
虽然你可以这样做,但你不应该这样做。你应该给这个方法一个不同的名字,否则它会导致方式比它增加的价值更多的混乱。
-
System.Linq.Enumerable.ToList(query)(但Servy所说) -
谢谢丹尼斯。它有效
-
你知道如何以上述方式调用 .SingleorDefault() 吗?
标签: c# linq linq-to-sql