使用join选择多个表中的多个项目

时间:2013-08-20 14:14:19

标签: c# sql linq .net-4.0

尝试将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很新,所以任何帮助都会很棒,谢谢!

4 个答案:

答案 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")
                }
            )