【问题标题】:ASP.net MVC.2 how to define a collection of multiple types in repository interfaceASP.net MVC.2 如何在存储库接口中定义多个类型的集合
【发布时间】:2011-06-28 14:47:51
【问题描述】:

我试图将列表返回到包含来自两个表的数据的显示模板,我正在使用存储库模式和视图模型将数据从返回两个对象的 LINQ 查询传递到视图

有没有在接口中定义多个类型的集合? 对于我在界面中使用过的单一类型,

    IQueryable<CustomerSite> CustomerSites { get; }

然后我在存储库中有我的 linq 查询

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

但是,由于这个新查询将包含 2 种类型,客户和客户站点,所以应该如何在界面中定义此集合?

======更新

我已尝试使用 .Include(这会引发错误,指出客户实体中没有包含的定义,不确定我是否缺少此名称空间?)

我也尝试过创建自定义界面,

public interface ICustomersAndSitesRepository
{
    IQueryable<CustomerSite> CustomerSites { get; }
    IQueryable<Customer> Customers { get; }
    IQueryable<ICustomersAndSitesRepository> CustomerAndSites { get; }
}

还有这个方法在仓库里

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

但是,当我尝试将集合传递给控制器​​中的视图时,

public ViewResult List([DefaultValue(1)] int page)
    {

        var customersWithSitesToShow = customersAndSitesRepository.CustomerAndSites;
        var viewModel = new CustomerSitesListViewModel
        {                
            Customers = customersWithSitesToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
            PagingInfo = new PagingInfo
            {
                CurrentPage = page,
                ItemsPerPage = PageSize,
                TotalItems = customersWithSitesToShow.Count()
            }
        };

        return View(viewModel);  //Passed to view as ViewData.Model (or simply model)
    }

将存储库重新转换为视图模型时出现转换错误

Cannot implicitly convert type  'System.Collections.Generic.List<CustomerDatabase.Domain.Abstract.ICustomersAndSitesRepository>' to 'System.Collections.Generic.IEnumerable<CustomerDatabase.WebUI.Models.CustomerViewModel>'. An explicit conversion exists (are you missing a cast?)  

我正在定义视图模型

公共 IEnumerable 客户 { get;放; }

谁能给我指出正确的方向?

【问题讨论】:

    标签: asp.net-mvc-2 interface repository viewmodel


    【解决方案1】:

    假设Customer 有很多CustomerSite,那么您将返回IQueryable&lt;Customer&gt;,但使用.Include 在每个Customer 中返回CustomerSites

    例如

    public IQueryable<Customer> GetCustomersAndSites()
    {
        return MyEntities.Customers.Include("CustomerSite");
    }
    

    【讨论】:

    • 感谢我试图实现这一点,但 .Include 会抛出一个错误,指出它未在客户实体中定义,.Include 是否需要命名空间才能工作?
    • @Liam,你应该只需要添加using System.Linq; 或者using System.Data.Entity;。但是,请确保正确拼写 Include entity,因为这是 EDMX 中显示的关系,而不是表名。如果是多对多关系,那么它可能是 CustomerSites。
    • @Liam,还要确保您在web.config 中的实体的连接字符串中指定了MultipleActiveResultSets=True
    • 嗨,谢谢,但是我已经在控制器中有 Linq 命名空间,data.entity 似乎没有显示,当我将 MultipleActiveResultSets=True 添加到 conn 字符串时,它表示该属性不是允许。
    【解决方案2】:

    返回一个包含您需要的每个集合的属性的 IQuerable 自定义接口怎么样?

    public interface ICustomersAndSites
    {
      IQueryable<CustomerSite> CustomerSites{get;}
      IQueryable<Customers> Customers{get;}
    }
    

    然后您可以在您的存储库中进行设置:

    public IQueryable<ICustomersAndSites> CustomerAndSites
        {
            get { return combinationObject; }
        }
    

    【讨论】:

    • 感谢您的建议,我正在尝试实现此功能但无法正常工作,我已更新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多