删除查询中的重复代码

时间:2012-04-23 07:23:19

标签: c# linq linq-to-sql c#-4.0 datacontext

我有这段代码:

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方法

时才会这样做

有什么想法吗?

4 个答案:

答案 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检测到一个数据上下文,该数据上下文使用的是不同于打开它的线程。” 但你解释的代码没有线程上下文,你错过了什么吗?