[英]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.