LinQ查询多个表并提取数据

vin*_*inz 6 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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*eet 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();
Run Code Online (Sandbox Code Playgroud)

现在,你不必做这样的-但它可能是最好的办法,至少你已经给我们的信息量.如果您可以告诉我们更多关于您如何组合多个表中的数据的信息,我们可以为您提供更多帮助.

编辑:好的,现在你给了我们更多的信息,我怀疑你想要:

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

我没有尝试在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 };
Run Code Online (Sandbox Code Playgroud)