簡體   English   中英

嘗試將兩個表linq連接到Sql

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM