【问题标题】:LINQ help for a beginner selecting multiple tables初学者选择多个表的 LINQ 帮助
【发布时间】:2011-06-29 15:38:36
【问题描述】:

我有以下存储库,其中包括用于返回我的 db 对象的三种方法,前两个查询工作正常,因为它们只返回一个数据列表,但是由于第三种方法需要从两个表中进行选择,我对如何这样做。

任何人都可以指出正确的方向,即如何编写 LINQ 查询以从两个相关表中进行选择,以传递到下面显示的存储库中的最后一个方法 (CustomerAndSites) - 这些表与客户 ID 字段相关,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CustomerDatabase.Domain.Abstract;
using CustomerDatabase.Domain.Concrete;
using CustomerDatabase.Domain.Entities;
using System.Data.Linq.Mapping;
using System.Data.Linq;
using System.Web.Mvc;

namespace CustomerDatabase.Domain.Concrete
{
 class SqlCustomersAndSitesRepository : ICustomersAndSitesRepository
{
    public Table<CustomerSite> customerSitesTable;
    public Table<Customer> customerTable;                              


    public SqlCustomersAndSitesRepository(string connectionString)
    {
        customerSitesTable = (new  DataContext(connectionString)).GetTable<CustomerSite>();
        customerTable = (new DataContext(connectionString)).GetTable<Customer>();
    }

    public IQueryable<CustomerSite> CustomerSites
    {
        get { return customerSitesTable; }
    }

    public IQueryable<Customer> Customers
    {
        get { return customerTable; }
    }

    public IQueryable <ICustomersAndSitesRepository> CustomerAndSites
    {
        get { return CustomerAndSites; }
    }

}

}

====更新

这是我的 ICustomersAndSitesM 接口,我在哪里定义 CustomersAndSitesMix,我需要将其创建为单独的实体吗?我的 UI 项目中有一个视图模型,其中包含两个对象的属性。

使用系统; 使用 System.Collections.Generic; 使用 System.Linq; 使用 System.Text; 使用 CustomerDatabase.Domain.Entities;

命名空间 CustomerDatabase.Domain.Abstract { 接口 ICustomersAndSitesM { 可查询的客户{得到; } IQueryable CustomerSites { 得到; } }

}

【问题讨论】:

  • 为什么要返回 ICustomersAndSitesRepository 的 IQueryable?这对我没有任何意义
  • 你在构造函数中做什么? !您是否运行/测试过这些代码?

标签: c# linq asp.net-mvc-2 repository viewmodel


【解决方案1】:

如果您的两个表实际上已通过外键正确链接,则当您拉入父记录时,LINQ 也会拉入子记录。您需要在调试时检查 DataContext 返回的模型,并且您应该能够通过足够的挖掘看到任何链接的记录。例如,如果您有链接到客户的站点,那么在您的客户域模型结果中,您应该会看到一个名为“站点”的字段,它是链接到客户的站点域模型的列表。

【讨论】:

  • 感谢您的建议,我的表是通过外键链接的,但是我可以从模型中访问这两个对象的唯一方法是使用包含两个对象属性的视图模型,对吗?需要用任何东西来装饰实体来定义外键关系吗?
  • 如果它已经在您的数据库中表示,则您不需要这样做。当您在模型设计器窗口中拖动表格时,如果您看到两个表格之间的关系线,那么您应该很好...等等...您使用的是实体框架吗?我正在描述它如何与 LINQ to SQL 一起工作。我没有EF的经验。如果你正在摇摆 EF,我的建议可能是你的月球人语言。
【解决方案2】:

我猜您实际上想要的是“CustomersAndSitesMix”,而不是返回“ICustomersAndSitesRepository”。如果是这样,你可以这样做:

public IQueryable<ICustomersAndSitesM> CustomerAndSites
{
    get
    {
        return from customer in customerTable
               join site in customerSitesTable
                    on customer.PLACEKEYHERE equals site.PLACEKEYHERE
               select new CustomersAndSitesMix(customer, site);
    }
}

【讨论】:

  • 你会明白,“CustomersAndSitesMix”只是包含来自两个类的信息混合的任何对象,并且有一个将这两个类作为参数的构造函数。
  • 感谢您的帮助,我猜 ICustomerAndSitesM 类似于我所说的 ICustomersAndSitesRepository,这只是两个实体的信息(我更新了问题以显示 ICustomerAndSitesM。不确定在哪里设置 CustomersAndSitesMix ,这个需要在接口ICustomerAndSitesM中定义吗?
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2021-04-11
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多