[英]Trying to join two tables linq to Sql
我有以下表格:
Table Name: console_details Table Name: console_features
------------------- -----------------
| console_id | | id |
------------------- -----------------
|console_name | | bluray |
------------------- -----------------
|console_type | | harddrive |
------------------- -----------------
|console_startdate|
-------------------
console_id字段和id字段都共享相同的数据公用字段,我想将这两个表从linq联接到sql查询,并获取控制台的硬盘驱动器大小。 我在stackoverflow上找不到与此类似的另一个问题。 有什么建议吗?
这是我的linq代码:
public IEnumerable<console_details> GetConsole(DateTime startDate, DateTime endDate)
{
DataClasses1DataContext mydatabase = new DataClasses1DataContext();
var results = from data in mydatabase.console_details
where data.console_startdate >= startDate &&
endDate >= data.console_startdate
select data;
return results;
}
您可以尝试以下方法:
DataClasses1DataContext mydatabase = new DataClasses1DataContext();
var results = from cd in mydatabase.console_details
join cf in mydatabase.console_features
on cd.console_id equals cf.id
where cd.console_startdate >= startDate &&
endDate >= cd.console_startdate
select new { Name = cd.console_name, HardDriveSize = cf.harddrive };
通过上面的查询,您将获得具有两个属性的匿名类型的对象序列
Name
,即console_name。 HardDriveSize
,它是硬盘驱动器的大小。 更新
首先,我们必须声明一个类型,该类型将具有我们需要的所有属性。 我将这种类型称为ConsoleView
。 您可以随意调用它,但是必须在以下代码中进行相应的更改。
public class ConsoleView
{
// console_id
public int Id { get; set; }
// console_name
public string Name { get; set; }
// console_type
public string ConsoleType {get; set; }
// console_startdate
public DateTime StartDate { get; set; }
// harddrive
public int HardDrive { get; set; }
}
我假设 harddrive
器的类型为int,而console_type
的类型为string。 如果不是这样,则必须相应地更改它们。
然后,您的方法应更改为以下方法:
public IEnumerable<ConsoleView> GetConsole(DateTime startDate, DateTime endDate)
{
DataClasses1DataContext mydatabase = new DataClasses1DataContext();
IEnumerable<ConsoleView> results = from cd in mydatabase.console_details
join cf in mydatabase.console_features
on cd.console_id equals cf.id
where cd.console_startdate >= startDate &&
endDate >= cd.console_startdate
select new ConsoleView
{
Id = cd.console_id,
Name = cd.console_name,
ConsoleType = cd.console_type,
StartDate = cd.console_startdate,
HardDriveSize = cf.harddrive
};
return results;
}
更新#2
从您在评论中发布的错误可以理解,您的数据上下文存在问题。 所以,如果DataClasses1DataContext已建成访问console_details
和DataClasses2DataContext已建成访问console_features
,那么你必须改变的方法,下面一个的代码:
public IEnumerable<ConsoleView> GetConsole(DateTime startDate, DateTime endDate)
{
DataClasses1DataContext mydatabase1 = new DataClasses1DataContext();
DataClasses2DataContext mydatabase2 = new DataClasses2DataContext();
IEnumerable<ConsoleView> results = from cd in mydatabase1.console_details
join cf in mydatabase2.console_features
on cd.console_id equals cf.id
where cd.console_startdate >= startDate &&
endDate >= cd.console_startdate
select new ConsoleView
{
Id = cd.console_id,
Name = cd.console_name,
ConsoleType = cd.console_type,
StartDate = cd.console_startdate,
HardDriveSize = cf.harddrive
};
return results;
}
为了简单起见,我在查询中忽略了您的startdate和enddate变量。 因为我没有您的数据,也没有提供sampledata,所以我使用Linq-to-Objects而不是Linq-to-SQL创建了一个测试用例:
有2个类代表您的表:
public class console_details
{
public int Id { get; set; }
public string console_name { get; set; }
public string console_type { get; set; }
}
public class console_features
{
public int Id { get; set; }
public double blueray { get; set; }
public double Harddrive { get; set; }
}
示例数据如下所示:
var consoleList = new List<console_details>()
{
new console_details() {Id = 1, console_name = "Ps4", console_type ="Next-Gen"},
new console_details() {Id = 2, console_name = "XB1", console_type ="Next-Gen"}
};
var featuresList = new List<console_features>()
{
new console_features() {Id = 1, blueray = 23.9, Harddrive = 100},
new console_features() {Id = 2, blueray = 30, Harddrive = 150}
};
最后但并非最不重要的一点是,我创建了一个ViewModel类来强烈键入结果:
public class ConsoleViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public double HardDrive { get; set; }
}
这样查询和输出看起来像这样:
var joinedResults = from con in consoleList
join feat in featuresList on con.Id equals feat.Id
select new ConsoleViewModel
{
Id = con.Id,
Name = con.console_name,
HardDrive = feat.Harddrive
};
使用此方法,您的方法应类似于以下内容:
public IEnumerable<ConsoleViewModel> GetConsole(DateTime startDate, DateTime endDate)
{
DataClasses1DataContext mydatabase = new DataClasses1DataContext();
var results = from data in mydatabase.console_details
join feat in mydatabase.console features on data.Id equals feat.Id
where data.console_startdate >= startDate
&& endDate >= data.console_startdate
select new ConsoleViewModel
{
Id = con.Id,
Name = con.console_name,
HardDrive = feat.Harddrive
};
return results;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.