LinQ查询多个表并提取数据

时间:2011-09-29 06:15:37

标签: c# linq

我正在对内连接4表进行查询,我必须提取数据并转换为字符串并将其放入数组中。

    var query = from a in context.as
                            join b in context.bs on a.prikey equals b.forkey
                            join c in context.cs on b.prikey equals c.forkey
                            join d in context.ds on c.prikey equals d.forkey
                            where b.gender == gender
                            where c.age == age
                            select new
                            {
                                a.Name,
                                a.Age,
                                b.Gender,
                            };
string[] results = new string[] {}
return results;

通常,如果涉及单个表 a as =表a的复数

as t = query.First() 
string[] results = new string[] {t.Name, t.Age, t.Gender}
return results;

我错过了提取数据的步骤。

2 个答案:

答案 0 :(得分:6)

这取决于你想要的确切数据。您的代码目前实际上不会编译,因为它正在尝试创建一个具有多个属性的匿名类型,所有属性都称为“arg”,但我假设您确实有一个更明智的查询。

最终,你使用多个表的事实在这里是无关紧要的 - 你一次只得到一个结果元素:每个结果元素包含来自多个表的数据的事实既不是在这里也不是在那里如何访问它。

现在我注意到你说你想“提取数据并转换成字符串”。如果可能,您应该在查询中表达。您可能能够在数据库中执行此操作,或者您可能需要强制执行的最后部分在本地执行,如下所示:

// Not executed yet!
var dbQuery = from a in context.a
              join b in context.bs on a.prikey equals b.forkey
              join c in context.cs on b.prikey equals c.forkey
              join d in context.ds on c.prikey equals d.forkey
              where ...
              select { a.Age, b.Name, c.Salary, d.Location };

// This still won't talk to the database!
var finalQuery = dbQuery.AsEnumerable()
                        .Select(x => string.format("Age: {0}; Name: {1}; " +
                                                   "Salary: {2}; Location: {3}",
                                                   x.Age, x.Name, x.Salary,
                                                   x.Location));

// This will finally execute the query
string[] results = finalQuery.ToArray();

现在你没有这样做 - 但这可能是最好的方法,至少在你给我们的信息量方面。如果您可以告诉我们更多关于您如何组合多个表格中的数据的信息,我们可以为您提供更多帮助。

编辑:好的,现在您已经向我们提供了更多信息,我怀疑您想要:

var query = from a in context.a
            join b in context.bs on a.prikey equals b.forkey
            join c in context.cs on b.prikey equals c.forkey
            join d in context.ds on c.prikey equals d.forkey
            where ...
            select new string[] { a.arg, b.arg, c.arg, d.arg };

 string[] results = query.First();

我没有尝试在LINQ to SQL中创建数组... 可能工作,或者您可能需要通过匿名类型和AsEnumerable按照之前的部分进行操作我的回答。

如果没有结果或多个结果,你还应该考虑你想要发生什么。

编辑:看过编辑过的问题后,你真的可以以与单个表相同的方式处理多个表。一旦将结果投影到匿名类型中,您就会使用完全相同的代码来处理结果:

var query = from a in context.as
            join b in context.bs on a.prikey equals b.forkey
            join c in context.cs on b.prikey equals c.forkey
            join d in context.ds on c.prikey equals d.forkey
            where ... 
            select new { a.Name, a.Age, b.Gender };

var result = query.First();
// Call ToString appropriately on each property, of course
string[] array = new string[] { result.Name, result.Age, result.Gender };

答案 1 :(得分:0)

var query = from a in context.a
                            join b in context.bs on a.prikey equals b.forkey
                            join c in context.cs on b.prikey equals c.forkey
                            join d in context.ds on c.prikey equals d.forkey
                            where a.arg == arg
                            where b.arg == arg
                            where c.arg == arg
                            select new
                            {
                               allStrings =  a.arg +
                                a.arg +
                                b.arg +
                                c.arg +
                                d.arg 
                            };
string[] results = query.ToArray();