1

尝试将 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 是一个具有多个表的数据集)

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

4 回答 4

3

首先,请注意,当您调用AsEnumerable查询时,必须在客户端上执行,而不是在 SQL 服务器上。我强烈建议将表格保留为IQueryable' 以避免这种情况。

接下来,正如Tim S.解释的那样,由于您的表不是强类型的,因此请使用该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") 
            };
于 2013-08-20T14:16:22.997 回答
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") };
于 2013-08-20T14:19:15.517 回答
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") }

为了可维护性和可扩展性,始终使用命名类型(自定义类)而不是匿名类型。

于 2013-08-20T14:21:46.520 回答
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")
                }
            )
于 2013-08-20T14:23:00.623 回答