Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除查询中的重复代码_C#_Linq_Linq To Sql_C# 4.0_Datacontext - Fatal编程技术网

C# 删除查询中的重复代码

C# 删除查询中的重复代码,c#,linq,linq-to-sql,c#-4.0,datacontext,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 }

我有以下代码:

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>();
list=\u dataContext.myTable
.Where(row=>row.Label.Contains(myText))
.OrderBy(行=>row.Label)
.选择(行=>new MyClass
{
Field1=行。Field1,
Field2=第2行。Field2,
Field3=行。Field3
}).ToList();
list=\u dataContext.myTable
.OrderBy(行=>row.Label)
.选择(行=>new MyClass
{
Field1=行。Field1,
Field2=第2行。Field2,
Field3=行。Field3
}).ToList();
如您所见,我有重复的代码。然后我会这样做:

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);
私有列表CreateObject(IOrderedQueryable列表)
{
返回列表。选择(行=>new MyClass
{
Field1=行。Field1,
Field2=第2行。Field2,
Field3=行。Field3
}).ToList();
}
结果=_dataContext.myTable
.Where(row=>row.Label.Contains(myText))
.OrderBy(row=>row.Label);
var finalList=CreateObject(结果);
执行此操作时,“Linq 2 SQL分析器”会给我以下警告:

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

只有当我使用
CreateObject
方法时,我才有这个功能

有什么想法吗?

嗯,有这样一个:


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

看起来你把事情弄得比需要的更复杂了。你最好做这样的事情:

// 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>();
//如果SuspendFilterByText为true,则Where()调用将始终返回true。
bool suspendFilterByText=true;
list=\u dataContext.myTable
.Where(row=>(suspendFilterByText | | row.Label.Contains(myText)))
.OrderBy(行=>row.Label)
.选择(行=>new MyClass
{
Field1=行。Field1,
Field2=第2行。Field2,
Field3=行。Field3
}).ToList();
这种方法在两种情况下都有效;您只需适当地设置
suspendFilterByText
。将其包装在一个方法中,您只需编写此代码一次

using a single data context in multiple thread is likely a bug.
这只是一个警告,而不是一个错误,这是正确的。因为linq查询仅在对linq查询使用结果或调用ToList或ToArray e.t.c方法时运行

因此,在本例中,当调用
.ToList()
时,将在方法
CreateObject
中访问DataContext


您可以忽略警告,否则您必须保留重复的代码。

请参考以下链接,

它说“LINQtoSQL探查器检测到一个数据上下文,该上下文在与它打开时使用的线程不同的线程中使用。”
但是您解释的代码没有线程上下文,您是否缺少一些内容?

如果您将CreateObject实现为IOrderedQueryable的扩展方法,您是否也得到了它?无论如何,最有可能的分析器错误。&&应该是| |还是我遗漏了什么