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

时间:2009-07-01 21:40:43

标签: c# linq linq-to-sql ado.net

在经典ASP中我们有记录集对象。有了ADO.Net,我们就有了数据表。

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

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

大多数示例显示正在使用“var”,但是,这似乎完全不是oo,因为您无法移动var(没有强制转换)。我的理解是,在“正确”的OO中,你永远不会检索数据并在同一个地方使用它,所以我看不到使用LINQ to SQL的var的任何价值。

我知道我可以为我检索的每个数据集创建一个自定义对象。但是,我真的不想这样做,因为它似乎是额外的工作和复杂性。如果我将这些数据中的任何一个循环播放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 };
}

3 个答案:

答案 0 :(得分:2)

你应该通过“四处走动”来限定你的意思。您在Classic 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;}
}

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

答案 1 :(得分:0)

我就是这样做的。

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

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

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 );
    }
}

答案 2 :(得分:0)

如果您在LINQ上设置了死区,则必须从变量(“electionInfo”)返回值中提取所需内容并将其传递,而不是传递左右参数变换本身。在某些情况下,这可能意味着制作自定义对象。 (但是,我不知道为什么会出现这样的问题,因为如果你没有使用LINQ或者你使用的是经典的ASP记录集,你可能会自己制作一个自定义对象)。

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

我的建议?在没有详细说明的情况下,我认为LINQ的优点超过了使用SqlDataReader所需的额外样板代码。