C# 多表LinQ查询与数据提取
我正在对内部join 4表进行查询,我必须提取数据并转换为字符串,然后将其放入数组中C# 多表LinQ查询与数据提取,c#,linq,C#,Linq,我正在对内部join 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
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;
我缺少提取数据的步骤 这取决于您想要对数据做什么。您的代码目前实际上不会编译,因为它试图创建一个匿名类型,其中包含多个属性,所有属性都称为“arg”,但我假设您确实有一个更合理的查询
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();
最终,使用多个表这一事实与此无关——一次只能得到一个结果元素:每个结果元素包含来自多个表的数据这一事实与您访问它的方式无关
现在我刚刚注意到,您说要“提取数据并转换为字符串”。如果可能,您应该在查询中表达这一点。您可以在数据库中执行,或者您可能需要强制执行的最后一部分在本地执行,如下所示:
// 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();
我还没有尝试在LINQtoSQL中创建数组。。。这可能行得通,或者根据我前面的回答,您可能需要通过匿名类型和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 };
as=表a的复数形式as t=query.First()string[]results=新字符串[]{t.firstval,t.secondval}不确定如何填写'as'您所说的所有字符串是什么意思?变量?@vinz:是的,将结果投影到临时变量
allStrings
我想从a.arg、a.arg、b.arg、c.arg、d.arg的select语句中获取数据。实际上,我会将表a的as=复数形式作为t=query.First()字符串[]results=new字符串[]{t.firstval,t.secondval}不确定如何填充“as”。@vinz:哦,我明白了。。。我想。这有点不清楚,或者至少不寻常。无论如何,我会编辑。@vinz:好的,现在看我答案的底部。请注意,示例查询中的where
子句是毫无意义的,因为目前您只是在保证得到一个{arg,arg,arg,arg}
字符串数组,因为您正是根据该条件筛选它们的。。。这就是给出实际例子的地方,这是一个很大的区别。这里是用外部因素过滤查询。首先说它与IQueryable一起工作。我正在处理一个web表单,而不是MVC方法。@vinz,但您的示例查询会根据所选数据的精确匹配进行筛选。希望你真正的疑问更明智。不管你是否在使用MVC都是无关紧要的。