尝试将SQL查询转换为LINQ(因为我已经添加了代码来下载2个SQL表并将它们保存到内存中的DataSet中)。因此,我需要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是一个包含多个表的DataSet)
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 s.item, s.item2, l.itemA, l.itemB;
我对LINQ很新,所以任何帮助都会很棒,谢谢!
答案 0 :(得分:3)
首先,请注意,当您调用AsEnumerable
时,必须在客户端上执行查询,而不是在SQL服务器上执行。我强烈建议将表格保留为IQueryable
以避免这种情况。
接下来,作为Tim S. explains,由于您的表格不是强类型,请使用Field<T>
方法检索列值。
最后,如果要返回多个列,则需要将结果分组为匿名类型:
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")
};
或者创建一个命名类型来表示结果:
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")
};
答案 1 :(得分:2)
由于您没有处理强类型结果,因此无法选择结果,例如s.item1
;您必须使用Field<>
(或类似的东西),就像在查询的其余部分一样。此外,由于您只能在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") };
答案 2 :(得分:1)
请试试这个
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") }
始终使用命名类型(自定义类)而不是匿名类型来实现可维护性和可扩展性。
答案 3 :(得分:0)
如果您想查看lambda语法
var query = DbConfig.Tables["table1"].AsEnumerable()
.Join
(
DbConfig.Tables["table2"].AsEnumerable(),
x=>x.Field<string>("item1"),
x=>x.Field<string>("itemB"),
(t1,t2)=>new {t1,t2}
)
.Where
(
x=>x.t2.Field<string>("itemA") == name
)
.Select
(
x=>
new
{
x.t1.Field<string>("item"),
x.t1.Field<string>("item2"),
x.t2.Field<string>("itemA"),
x.t2.Field<string>("itemB")
}
)