Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 如何使用LINQ to SQL将数据检索到可移动的弱类型对象中_C#_Linq_Linq To Sql_Ado.net - Fatal编程技术网

C# 如何使用LINQ to SQL将数据检索到可移动的弱类型对象中

C# 如何使用LINQ to SQL将数据检索到可移动的弱类型对象中,c#,linq,linq-to-sql,ado.net,C#,Linq,Linq To Sql,Ado.net,在经典ASP中,我们有记录集对象。通过ADO.Net,我们得到了datatable 两者都是简单的.Net对象,可以轻松地移动 使用LINQ到SQL的等价物是什么? 大多数示例都显示使用了“var”,但是,这似乎完全不是面向对象的,因为您无法移动var(没有cast hack)。我的理解是,在“适当的”OO中,您永远不会检索数据并在同一个位置使用它,因此我看不出将var与LINQ结合使用有任何价值 我知道我可以为检索到的每个数据集创建一个自定义对象。然而,我真的不想这样做,因为这似乎是额外的工作

在经典ASP中,我们有记录集对象。通过ADO.Net,我们得到了datatable

两者都是简单的.Net对象,可以轻松地移动

使用LINQ到SQL的等价物是什么?

大多数示例都显示使用了“var”,但是,这似乎完全不是面向对象的,因为您无法移动var(没有cast hack)。我的理解是,在“适当的”OO中,您永远不会检索数据并在同一个位置使用它,因此我看不出将var与LINQ结合使用有任何价值

我知道我可以为检索到的每个数据集创建一个自定义对象。然而,我真的不想这样做,因为这似乎是额外的工作和复杂性。如果我将这些数据循环1000次(装箱/拆箱),我会这样做。但在这种情况下,我不是循环,我不想让事情变得简单,我不怕有一点装箱/拆箱,我无法想象它会以一种明显的方式影响性能

以下是我正在使用的代码:

using (ormDataContext context = new ormDataContext(connStr))
{
    var electionInfo = from t1 in context.elections
               join t2 in context.election_status
               on t1.statusID equals t2.statusID
               select new { t1, t2 };
}

我会这样做的

我将在这两个表之间创建一个外键关系(以及索引,如果合适的话)。我将在我的项目中创建一个新的Linq到Sql类对象,它将创建一个DBML文件。我将打开DBML文件以获得新数据上下文的设计器图面,并从服务器资源管理器中拖动这两个表——当然,在创建到DB的连接之后

这将创建与我的数据上下文中的两个表以及它们之间的关联相匹配的实体。这将给我一个选举实体中与选举状态相对应的EntityRef,或者一个EntitySet,这取决于它是1-1关系还是1-Many关系。我会使用关联,而不是进行联接来获取每次选举的数据

using (var context = new ormDataContext(connStr))
{
    foreach (var election in context.Elections)
    {
        Console.WriteLine( "{0}: {1}",
                           election.Name,
                           election.Election_Status.Status );
    }
}
如果我想按特定的状态进行筛选,我也可以这样做

using (var context = new ormDataContext(connStr))
{
    var query = context.Elections
                       .Where( e => e.Election_Status.Status == someStatus );

    foreach (var election in query)
    {
        Console.WriteLine( "{0}: {1}",
                           election.Name,
                           election.Election_Status.Status );
    }
}

如果您死心塌地地使用LINQ,则必须从变量(“electionInfo”)返回值中提取所需内容并传递,而不是传递electionInfo变量本身。在某些情况下,这可能意味着创建自定义对象。(尽管如此,我不知道为什么会出现这样的问题,因为如果不使用LINQ或使用classic ASP的记录集,您可能已经创建了自定义对象)

您也可以简单地忽略LINQ并使用“SqlCommand..ExecuteReader”方法,该方法返回SqlDataReader。这就是大多数Sql查询在LINQ之前的读取方式


我的建议?在不深入太多细节的情况下,我认为LINQ的优势超过了使用SqlDataReader所需的额外样板代码

你应该限定你所说的“四处走动”的意思。您在经典ASP中可能做的很多事情现在都被认为是一种不好的做法,请注意不要重复已经解决了多年的众所周知的错误

而且,“var”是强类型的,只是匿名的:“没有名字”,而不是“没有类型”

请说明“适当的OO”是什么意思,不允许在同一个地方获取和使用数据

此外,请记住,示例旨在展示各个功能。没有一个例子能向你展示一切。特别是,“如何返回匿名类型”的答案是“您不返回匿名类型”。例如:

using (ormDataContext context = new ormDataContext(connStr))
{
    var electionInfo = from t1 in context.elections
               join t2 in context.election_status
               on t1.statusID equals t2.statusID
               select new ElectionWithStatus { Election=t1, Status=t2 };
}
其中:

public class ElectionWithStatus {
    public Election Election {get;set;}
    public ElectionStatus Status {get;set;}
}

所以,底线是,如果你必须移动它,那么移动一个强类型对象,而不是弱类型对象。

我所说的移动是指从方法返回或分配给对象属性,即移出本地上下文。所谓“适当的OO”,我的意思是,例如,检索一个对象中的数据,并在另一个对象中实际使用,即分离关注点、数据访问层等。我不确定我是否理解现在是否可以从函数返回electionInfo匿名类型,但我将尝试它,thx。“electionInfo”是实现IQueryable的匿名类型的实例。它实现了一个接口,这一事实允许任何控制它的代码以强类型的方式使用它。仅使用“selectnew{…}”,您将返回一个IQueryable实例,其中“T”是未知的-调用者将不知道其中包含什么。您误解了“var”的含义。不是使用var使electionInfo无法移动,而是使用selectnew{…}。这将创建一个匿名对象。如果要在其他地方使用结果,则需要显式类型。