我有这段代码:
list = _dataContext.myTable
.Where(row => row.Label.Contains(myText))
.OrderBy(row => row.Label)
.Select(row => new MyClass
{
Field1 = row.Field1,
Field2 = row.Field2,
Field3 = row.Field3
}).ToList<IMyClass>();
list = _dataContext.myTable
.OrderBy(row => row.Label)
.Select(row => new MyClass
{
Field1 = row.Field1,
Field2 = row.Field2,
Field3 = row.Field3
}).ToList<IMyClass>();
如您所见,我有重复的代码。然后我这样做:
private List<IMyClass> CreateObject(IOrderedQueryable<myTable> list)
{
return list.Select(row => new MyClass
{
Field1 = row.Field1,
Field2 = row.Field2,
Field3 = row.Field3
}).ToList<IMyClass>();
}
result = _dataContext.myTable
.Where(row => row.Label.Contains(myText))
.OrderBy(row => row.Label);
var finalList = CreateObject(result);
当我这样做时,“Linq 2 SQL profiler”给了我这个警告:
在多个hread中使用单个数据上下文可能是一个错误。
我只有在使用CreateObject
方法
有什么想法吗?
答案 0 :(得分:1)
看起来你正在制造比他们需要的更复杂的东西。你最好做这样的事情:
// If suspendFilterByMyText is true, the Where() call will always return true.
bool suspendFilterByMyText = true;
list = _dataContext.myTable
.Where(row => (suspendFilterByMyText || row.Label.Contains(myText)))
.OrderBy(row => row.Label)
.Select(row => new MyClass
{
Field1 = row.Field1,
Field2 = row.Field2,
Field3 = row.Field3
}).ToList<IMyClass>();
这种方法在两种情况下都有效;你只需要适当地设置suspendFilterByMyText
。将其包装在一个方法中,您只需编写一次此代码。
答案 1 :(得分:0)
嗯,就是这样:
http://l2sprof.com/Learn/Alerts/CrossThreadSessionUsage
简单地说;如果正在同步声明和访问这些方法的类,则可以忽略此消息。 _dataContext是您的程序集的全局变量还是在您的类中定义的?你确定按照你期望的顺序调用你的方法吗?
答案 2 :(得分:0)
using a single data context in multiple thread is likely a bug.
这只是一个警告而不是错误,它是对的。因为linq查询仅在您使用结果或在linq查询上调用ToList或ToArray e.t.c方法时运行。
因此,在您调用CreateObject
时,您的方法.ToList()
将访问DataContext。
您可以忽略该警告,否则您必须保持代码重复。
答案 3 :(得分:0)
请参阅以下链接, http://l2sprof.com/Learn/Alerts/CrossThreadSessionUsage
它说“Linq to Sql Profiler检测到一个数据上下文,该数据上下文使用的是不同于打开它的线程。” 但你解释的代码没有线程上下文,你错过了什么吗?