0

我有以下 viewModel 类:-

public class RackJoin
    {
        public TMSRack Rack { get; set; }
        public Resource Resource { get; set; }
        public Technology Technology { get; set; }
        public ComponentDefinition ComponentDefinition { get; set; }
        public SDOrganization Site { get; set; }
        public SDOrganization Customer { get; set; }
    }

以及以下用于连接两个实体的未完成存储库模型方法:-

public IQueryable<TMSRack> AllFindRacks(string q)
        {
            List<RackJoin> rakjoin = new List<RackJoin>();
            var result = from rack in tms.TMSRacks
           .Include(rack => rack.DataCenter)
           .Include(rack => rack.Zone)
           .Include(rack => rack.TMSFirewalls)
           .Include(rack => rack.TMsRouters)
           .Include(rack => rack.TMSServers)
           .Include(rack => rack.TMSStorageDevices)
           .Include(rack => rack.TMSSwitches)
           .Include(rack => rack.Technology)
                         join resource in entities.Resources
                         .Include(a => a.ComponentDefinition)
                           .Include(a => a.ResourceLocation.SiteDefinition.SDOrganization)
                           .Include(a => a.ResourceLocation.SiteDefinition.AccountDefinition.SDOrganization)
                         on rack.Technology.IT360ID equals resource.RESOURCEID
                         where (q == null || rack.Technology.Tag.ToUpper().StartsWith(q.ToUpper()))
                         select //not sure what i should write here;

第一个问题;但我不确定如何List<RackJoin>在上述方法中根据连接结果填充。

第二个问题;我从以下操作方法调用上述方法:-

 public ActionResult Index(string searchTerm = null, int page = 1)
            {
                var racks = repository.AllFindRacks(searchTerm).OrderBy(a => a.Technology.Tag).ToPagedList(page, 5);
                if (Request.IsAjaxRequest())
                {
                    return PartialView("_RackTable", racks);
                }
                return View(racks);
            }

所以我能知道分页和连接是如何一起工作的吗?我的意思是 EF 会对满足 where 子句的所有记录进行连接,然后它会跳过并取走。以及跳过和采取将应用于哪些实体?

4

1 回答 1

1

第一个问题:

您将可以访问选择中的两个范围变量,因此您可以拥有一个具有机架和资源属性的视图模型。

select new RackJoin { 
         Rack = rack, 
         Resource = resource
     };

第二个问题:

只要您返回 IQueryable,EF 就应该看到 Skip 和 Take 运算符并将它们应用到 SQL 查询中,因此 SQL Server 负责连接和分页。

注意:您可以删除新的 List 代码行。

我的标准 LINQ 运算符文章中有更多使用连接的示例。希望有帮助。

于 2013-08-08T14:00:51.263 回答