如何从使用LINQ to SQL的方法返回查询结果

alc*_*cal 1 c# linq linq-to-sql

这是我正在使用的代码,我对LINQ仍然有点新,所以这是一项正在进行中的工作.具体来说,我想从此查询中获取结果(大约7列字符串,整数和日期时间),并将它们返回给调用包含此LINQ to SQL查询的方法的方法.一个简单的代码示例将非常有用.

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 };
}
Run Code Online (Sandbox Code Playgroud)

(在这种情况下,我的查询返回2个表的所有内容,选举和election_status.)

Rei*_*ica 5

具体来说,我想从这个查询得到我的结果(大约7列字符串,整数和日期时间),并返回它们

嗨,你的查询问题是你正在创建一个匿名类型.您无法从方法返回匿名类型,因此这将是您遇到麻烦的地方.

你需要做的是创建一个"包装"类型,可以进行选举和elect_status,然后返回那些.

这是我正在谈论的一些小样本; 正如你所看到的,我宣布了一个Tuple类.您将查询包装的方法返回IEnumerable.

我希望这有帮助 :-)

class Tuple
{
    Election election;
    Election_status election_status;

    public Tuple(Election election, Election_status election_status)
    {
        this.election = election;
        this.election_status = election_status;
    }
}

public IEnumerable<Tuple> getElections()
{
    IEnumerable<Tuple> result = null;

    using (ormDataContext context = new ormDataContext(connStr))
    {
        result = from t1 in context.elections
                 join t2 in context.election_status
                 on t1.statusID equals t2.statusID
                 select new Tuple(t1, t2);
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据NagaMensch的评论,实现所需结果的更好方法是使用内置的LINQ to SQL关联.

如果您转到实体图并单击工具箱,您将看到3个选项.类,关联和继承.我们想使用协会.

  • 单击关联并单击ElectionStatus实体,按住鼠标按钮,它将允许您向选举实体绘制一条线.

  • 绘制线后,它将询问您关联中涉及哪些属性.您希望从Election实体中选择StatusId列,并从ElectionStatus实体中选择StatusId列.

现在您已经完成了映射,您将能够大大简化查询,因为不需要连接.您可以通过LINQ to SQL将添加到Election实体的全新属性访问选举状态.

您的代码现在看起来像这样:

//context has to be moved outside the function
static ExampleDataContext context = new ExampleDataContext();

//Here we can return an IEnumerable of Election now, instead of using the Tuple class
public static IEnumerable<Election> getElections()
{
    return from election in context.Elections
           select election;
}

static void Main(string[] args)
{
    //get the elections
    var elections = getElections();

    //lets go through the elections
    foreach (var election in elections)
    {
        //here we can access election status via the ElectionStatus property
        Console.WriteLine("Election name: {0}; Election status: {1}", election.ElectionName, election.ElectionStatus.StatusDescription);
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以在此处找到LINQ to SQL关联的"操作方法" .

注意:值得一提的是,如果您在数据库中的表之间建立了FK关系; LINQ to SQL将自动选择关系并为您映射关联(因此创建属性).