Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用join跨多个表选择多个项目_C#_Sql_Linq_.net 4.0 - Fatal编程技术网

C# 使用join跨多个表选择多个项目

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

尝试将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.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