2

我有这个代码:

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”给了我这个警告:

在多线程中使用单个数据上下文可能是一个错误。

我只有在使用该CreateObject方法时才有这个

有任何想法吗?

4

4 回答 4

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适当地设置。将其包装在一个方法中,您只需编写一次此代码。

于 2012-04-23T07:40:42.433 回答
0
using a single data context in multiple thread is likely a bug.

这只是警告而不是错误,这是正确的。因为 linq 查询仅在您使用结果或在 linq 查询上调用 ToList 或 ToArray 等方法时运行。

CreateObject因此,在您的情况下,当您调用DataContext 时,将在您的方法中访问它.ToList()

您可以简单地忽略警告,否则您必须保持代码重复。

于 2012-04-23T07:46:37.337 回答
0

请参考以下链接, http: //l2sprof.com/Learn/Alerts/CrossThreadSessionUsage

它说“Linq to Sql Profiler 检测到一个数据上下文在与打开它的线程不同的线程中使用。” 但是您解释的代码没有线程上下文,您是否遗漏了什么?

于 2012-04-23T09:15:19.410 回答
0

嗯,有这个:

http://l2sprof.com/Learn/Alerts/CrossThreadSessionUsage

简单地说; 如果您在其中声明和访问这些方法的类正确同步,则可以忽略此消息。_dataContext 对您的程序集是全局的还是在您的类中定义的?你确定你的方法是按照你期望的顺序调用的吗?

于 2012-04-23T07:33:53.963 回答