【问题标题】:Trying to join two tables linq to Sql试图将两个表 linq 连接到 Sql
【发布时间】:2014-08-08 14:29:52
【问题描述】:

我有以下表格:

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;
}

【问题讨论】:

  • 你说你有两张表,console_details和console_features。但是,在您的查询中,您尝试从名为 game_console 的第三个表中选择数据。后一个表如何与console_details 和console_features 关联?我假设这个表 game_console 会有一个 console_id。那么你为什么要加入console_details 和console_features 而不是立即加入game_console 和console_features?最后要选择哪些文件?谢谢
  • 抱歉,请查看新编辑
  • 没问题,伙计。
  • 请查看我的更新编辑。

标签: c# sql linq


【解决方案1】:

你可以试试这个:

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,即控制台名称。
  • 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

我从您在 cmets 上发布的错误中了解到,您的数据上下文存在问题。所以,如果已经为访问console_details而构建了DataClasses1DataContext,并且为访问console_features而构建了DataClasses2DataContext,那么您必须将方法中的代码更改为以下代码:

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;
}

【讨论】:

    【解决方案2】:

    为简单起见,我在查询中忽略了您的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多