C# 使用join跨多个表选择多个项目
尝试将SQL查询转换为LINQ(因为我添加了代码来下载2个SQL表并将它们保存到内存中的数据集)。因此,我需要LINQ选择与SQL相同的内容 SQL查询C# 使用join跨多个表选择多个项目,c#,sql,linq,.net-4.0,C#,Sql,Linq,.net 4.0,尝试将SQL查询转换为LINQ(因为我添加了代码来下载2个SQL表并将它们保存到内存中的数据集)。因此,我需要LINQ选择与SQL相同的内容 SQL查询 SELECT s.item1, s.item2, l.itemA, l.itemB FROM table1 s, table2 l WHERE l.itemA = name AND s.item1 = l.itemB 到目前为止我还没有编译的内容(DBConfig是一个包含多个表的数据集) var query=来自DbConfig.Table
SELECT s.item1, s.item2, l.itemA, l.itemB
FROM table1 s, table2 l
WHERE l.itemA = name AND s.item1 = l.itemB
到目前为止我还没有编译的内容(DBConfig是一个包含多个表的数据集)
var query=来自DbConfig.Tables[“table2”].AsEnumerable()中的l
在DbConfig.Tables[“table1”]中连接s。l.Field(“itemB”)上的AsEnumerable()等于s.Field(“item1”)
其中l.Field(“itemA”)==名称
选择s.item、s.item2、l.itemA、l.itemB;
我是LINQ的新手,所以任何帮助都会很好,谢谢 首先,请注意,当您调用
AsEnumerable
时,查询必须在客户机上执行,而不是在SQL server上执行。我强烈建议将表保留为IQueryable
,以避免出现这种情况
接下来,因为您的表不是强类型的,所以使用字段
方法检索列值
最后,如果要返回多个列,则需要将结果分组为匿名类型:
var query = from l in DbConfig.Tables["table2"]
join s in DbConfig.Tables["table1"]
on l.Field<string>("itemB") equals s.Field<string>("item1")
where l.Field<string>("itemA") == name
select new {
item = s.Field<string>("item"),
item2 = s.Field<string>("item2"),
itemA = l.Field<string>("itemA"),
itemB = l.Field<string>("itemB")
};
var query=来自DbConfig.Tables[“table2”]
在DbConfig.Tables[“table1”]中加入
在l.Field(“itemB”)上等于s.Field(“item1”)
其中l.Field(“itemA”)==名称
选择新{
项目=s.字段(“项目”),
item2=s.字段(“item2”),
itemA=l.字段(“itemA”),
itemB=l.字段(“itemB”)
};
或创建一个命名类型来表示结果:
public class MyResultType {
public string item { get; set; }
public string item2 { get; set; }
public string itemA { get; set; }
public string itemB { get; set; }
}
var query = from l in DbConfig.Tables["table2"]
join s in DbConfig.Tables["table1"]
on l.Field<string>("itemB") equals s.Field<string>("item1")
where l.Field<string>("itemA") == name
select new MyResultType {
item = s.Field<string>("item"),
item2 = s.Field<string>("item2"),
itemA = l.Field<string>("itemA"),
itemB = l.Field<string>("itemB")
};
公共类MyResultType{
公共字符串项{get;set;}
公共字符串item2{get;set;}
公共字符串itemA{get;set;}
公共字符串itemB{get;set;}
}
var query=来自DbConfig.Tables[“table2”]
在DbConfig.Tables[“table1”]中加入
在l.Field(“itemB”)上等于s.Field(“item1”)
其中l.Field(“itemA”)==名称
选择新的MyResultType{
项目=s.字段(“项目”),
item2=s.字段(“item2”),
itemA=l.字段(“itemA”),
itemB=l.字段(“itemB”)
};
首先,请注意,当您调用AsEnumerable
时,查询必须在客户机上执行,而不是在SQL server上执行。我强烈建议将表保留为IQueryable
,以避免出现这种情况
接下来,因为您的表不是强类型的,所以使用字段
方法检索列值
最后,如果要返回多个列,则需要将结果分组为匿名类型:
var query = from l in DbConfig.Tables["table2"]
join s in DbConfig.Tables["table1"]
on l.Field<string>("itemB") equals s.Field<string>("item1")
where l.Field<string>("itemA") == name
select new {
item = s.Field<string>("item"),
item2 = s.Field<string>("item2"),
itemA = l.Field<string>("itemA"),
itemB = l.Field<string>("itemB")
};
var query=来自DbConfig.Tables[“table2”]
在DbConfig.Tables[“table1”]中加入
在l.Field(“itemB”)上等于s.Field(“item1”)
其中l.Field(“itemA”)==名称
选择新{
项目=s.字段(“项目”),
item2=s.字段(“item2”),
itemA=l.字段(“itemA”),
itemB=l.字段(“itemB”)
};
或创建一个命名类型来表示结果:
public class MyResultType {
public string item { get; set; }
public string item2 { get; set; }
public string itemA { get; set; }
public string itemB { get; set; }
}
var query = from l in DbConfig.Tables["table2"]
join s in DbConfig.Tables["table1"]
on l.Field<string>("itemB") equals s.Field<string>("item1")
where l.Field<string>("itemA") == name
select new MyResultType {
item = s.Field<string>("item"),
item2 = s.Field<string>("item2"),
itemA = l.Field<string>("itemA"),
itemB = l.Field<string>("itemB")
};
公共类MyResultType{
公共字符串项{get;set;}
公共字符串item2{get;set;}
公共字符串itemA{get;set;}
公共字符串itemB{get;set;}
}
var query=来自DbConfig.Tables[“table2”]
在DbConfig.Tables[“table1”]中加入
在l.Field(“itemB”)上等于s.Field(“item1”)
其中l.Field(“itemA”)==名称
选择新的MyResultType{
项目=s.字段(“项目”),
item2=s.字段(“item2”),
itemA=l.字段(“itemA”),
itemB=l.字段(“itemB”)
};
由于您没有处理强类型的结果,因此无法使用选择结果,例如,s.item1
;您必须使用字段
(或类似的内容),就像查询的其余部分一样。此外,由于在LINQ查询中只能选择一个对象,并且需要四个值,因此应该在新的匿名类型中选择它们,或者创建一个类型来存储它们
var query = from l in DbConfig.Tables["table2"].AsEnumerable()
join s in DbConfig.Tables["table1"].AsEnumerable()
on l.Field<string>("itemB") equals s.Field<string>("item1")
where l.Field<string>("itemA") == name
select
new { Item1 = s.Field<string>("item1"), Item2 = s.Field<string>("item2"),
ItemA = l.Field<string>("itemA"), ItemB = l.Field<string>("itemB") };
var query=来自DbConfig.Tables[“table2”].AsEnumerable()中的l
在DbConfig.Tables[“table1”].AsEnumerable()中加入s
在l.Field(“itemB”)上等于s.Field(“item1”)
其中l.Field(“itemA”)==名称
选择
新的{Item1=s.Field(“Item1”),Item2=s.Field(“Item2”),
ItemA=l.Field(“ItemA”),ItemB=l.Field(“ItemB”)};
由于您没有处理强类型的结果,因此无法使用选择结果,例如,s.item1
;您必须使用字段
(或类似的内容),就像查询的其余部分一样。此外,由于在LINQ查询中只能选择一个对象,并且需要四个值,因此应该在新的匿名类型中选择它们,或者创建一个类型来存储它们
var query = from l in DbConfig.Tables["table2"].AsEnumerable()
join s in DbConfig.Tables["table1"].AsEnumerable()
on l.Field<string>("itemB") equals s.Field<string>("item1")
where l.Field<string>("itemA") == name
select
new { Item1 = s.Field<string>("item1"), Item2 = s.Field<string>("item2"),
ItemA = l.Field<string>("itemA"), ItemB = l.Field<string>("itemB") };
var query=来自DbConfig.Tables[“table2”].AsEnumerable()中的l
在DbConfig.Tables[“table1”].AsEnumerable()中加入s
在l.Field(“itemB”)上等于s.Field(“item1”)
其中l.Field(“itemA”)==名称
选择
新的{Item1=s.Field(“Item1”),Item2=s.Field(“Item2”),
ItemA=l.Field(“ItemA”),ItemB=l.Field(“ItemB”)};
请试试这个
var data=from dr1 in DbConfig.Tables["table2"].AsEnumerable()
join dr2 in DbConfig.Tables["table1"].AsEnumerable()
on dr1.Field<string>("itemB") equals dr2.Field<string>("item1")
where dr1.Field<string>("itemA") == name
select new {item = dr2.Field<string>("item"),
item2 = dr2.Field<string>("item2"),
itemA = dr1.Field<string>("itemA"),
itemB = dr1.Field<string>("itemB") }
var data=来自DbConfig.Tables[“table2”].AsEnumerable()中的dr1
在DbConfig.Tables[“table1”].AsEnumerable()中加入dr2
在dr1上,字段(“itemB”)等于dr2.字段(“item1”)
其中dr1.Field(“itemA”)==名称
选择新的{item=dr2.Field(“item”),
item2=dr2.字段(“item2”),
itemA=dr1.字段(“itemA”),
itemB=dr1.Field(“itemB”)}
为了可维护性和可扩展性,请始终使用命名类型(自定义类)而不是匿名类型。请尝试此方法
var data=from dr1 in DbConfig.Tables["table2"].AsEnumerable()
join dr2 in DbConfig.Tables["table1"].AsEnumerable()
on dr1.Field<string>("itemB") equals dr2.Field<string>("item1")
where dr1.Field<string>("itemA") == name
select new {item = dr2.Field<string>("item"),
item2 = dr2.Field<string>("item2"),
itemA = dr1.Field<string>("itemA"),
itemB = dr1.Field<string>("itemB") }
var数据=来自中的dr1