【问题标题】:How does one populate multiple lists with a LINQ statement如何使用 LINQ 语句填充多个列表
【发布时间】:2013-11-27 04:09:10
【问题描述】:

我有一个包含两个列表的视图模型。一个来自属性表,一个是该属性的办公室信息。在 SQL 中,如果我想要这两个表,我可以这样做:

Select o.*, p.*, op.* From Property p
Inner Join OfficeProperty op On p.property_id = op.property_id
Inner Join Broker b On b.broker_id = op.broker_id
Inner Join BrokerOffice bo On bo.broker_id = b.broker_id
Where p.property_id = 5555
And b.active = 1 And bo.office_type = 'Main' And op.active_listing = 1

这将为我提供与该物业相关的办公室的所有信息以及所有物业信息。如果我有以下视图模型:

public class CompletePropertyInfo
{     
  public Property property { get; set; }
  public OfficeProperty officeProperty { get; set; }
  public Office { get; set; }
}

public class myViewModel
{     
  public List<CompletePropertyInfo> propertyInfoList { get; set; }
}

也许我在编辑 2 中要求的是,也许我应该为 CompletePropertyInfo 提供这个:

public class CompletePropertyInfo
{     
  public Property property { get; set; }
  public List<OfficeProperty> officeProperty { get; set; }
  public List<Office> { get; set; }
}

我怎样才能用property.*填写property list,用office.*等填写office list?

我觉得我不应该用不同的选择来运行三个具有相同标准的语句来填充它们。也许这是唯一的方法?

编辑:我扩展了示例代码以更好地展示我的实际代码是什么样的。出于安全原因,我无法复制和粘贴确切的代码。

编辑 2: 关于现实世界应用程序的注释,我正在尝试对我们的内部系统进行属性搜索。我要么想要一堆基于标准的属性,要么只想要一个(如果提供了属性 ID)。

当我看到每个人的 cmets 关于为什么会有原始属性列表时,我意识到我将我正在查看的两个类混合在一起。现在这应该是正确的代码......我很抱歉我的错误,下次我必须三重检查我写的内容。我已经编辑了 SQL 以几乎准确地显示我在内部连接四个表时所做的事情,但只想填充其中三个表的模型。我不需要存储经纪人表,只需要它为经纪人办公室过滤掉一些记录。 ViewModel 只是我得到的所有 CompletePropertyInfos 的列表。 CompletePropertyInfo 是我试图从一个语句中填充的内容,而不是将上述 sql 分解为三个单独的语句。该列表可以是针对特定属性搜索的大小为 1 的,也可以是针对更多属性的多个。

我最终将不得不做一个 LINQ 语句,创建一个 CompletePropertyInfos 列表,这就是为什么我最初考虑这些列表的原因,因为搜索 LINQ 必须带回一个属性列表和相应的办公室。没有 p.property_id = 5555 的 SQL 将是相同的,因此它将返回系统中的所有属性,我希望在 List 中得到它。

TLDR:我想知道是否可以通过一个 linq 语句将所有结果填充到 CompletePropertyInfo 列表中。该列表可以是针对特定属性搜索的大小为 1 的,也可以是针对更多属性的多个。

public class CompletePropertyInformation
{
    public RR_Property property { get; set; }
    public IQueryable<OfficeProperty> officePropertyList { get; set; }
    public IQueryable<Office> officeList { get; set; }
}

List<CompletePropertyInformation> propertyIDSearch = (from p in db.Property
                                                                      where p.property_id == searchCriteria.propertyID
                                                                      select new CompletePropertyInformation
                                                                      {
                                                                          property = p,
                                                                          officePropertyList = (from bp in db.officeProperty                                                                                                
                                                                                            where bp.active_listing == true && bp.property_id == p.property_id
                                                                                            select bp),
                                                                          OfficeList = (from bo in db.Office                                                                                              
                                                                                          join bp in db.officeProperty on b.office_id equals bp.office_id
                                                                                          where bp.active_listing == true && bp.property_id == p.property_id && bo.office_type == "P"
                                                                                          select bo)
                                                                                }).ToList<CompletePropertyInformation>();

编辑 3: 我得到了一些对我有用的东西,我正在发布上面的代码。有了这个,我有两个问题

  1. 这是处理此问题的正确/最佳方法吗?
  2. 如何改写问题,以便让其他人更好地了解我想要做什么,用几个列表填充模型。

【问题讨论】:

  • 你在使用实体框架吗?
  • 是的。我正在使用 Entity Framework 将我的数据库表转换为模型对象。数据库优先方法。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 你的上下文对象拥有所有的办公室,如果它们在你的数据库中相关(你说你先做了一个数据库),然后你可以访问每个办公室对象的 o.Properties 来获取你的属性列表.
  • 您的视图模型感觉不对。 (为什么)如果您按 id 提取属性(我假设 property_id 是属性表中的主键),它最多会产生一个属性,因此您的视图模型应该是 'public class myViewModel { public Property property { get;放; } 公共列表 { 获取;放; }'。获得财产后,只需运行“Select o.* From Office o Where o._id = 5555”即可获取所有办公室并将它们分配给您查看的 Offices 财产。

标签: c# asp.net asp.net-mvc linq list


【解决方案1】:

考虑到您的Property 对象似乎有许多Office 对象,您应该调整您的视图模型,使其拥有一个包含办公室列表的属性。在这种情况下,您可以轻松地执行以下 LINQ 语句:

var myModel = db.Properties.Where(property => property_id = 5555)
                           .Select(p => new myViewModel { Property = p, Offices = p.Offices });

编辑:您编辑的结构差异不会像您想象的那样影响 LINQ 查询。为了将这两个列表放在一起,您需要执行以下操作:

var myModel = db.Properties.Where(property => property_id = 5555)
                           .Select(p => new myViewModel { Property = p, 
                                                          OfficeProperty = p.OfficeProperties,
                                                          Offices = p.OfficeProperties.Select(op => op.Office) });

【讨论】:

  • 结构有点不同。希望我在编辑上面所做的代码时更好地解释了自己。
  • 我再次编辑了我的问题,并对主要问题发表了评论。它现在应该完全解释我想要做什么。对于您的编辑 2,如何填充 p.OfficeProperies?我不熟悉该语法,它使 OfficeProperties 看起来像是 Property 的数据库列,但它不是。它们是在 property_id 上连接的单独表。
  • 我想我有一些工作,我会在明天对其进行编辑 3 向您展示我的想法,我们可以检查它是否正确。
【解决方案2】:

假设您有两张桌子。一个是父表'TableA'和子表'TableB'。 而TableB包含一个TableA的外键。

如果您使用的是 LINQ,则不必执行连接。它将从父表和子表中检索数据。

当你写查询时

var data  = db.TableA.Where(a => a.id == 1).FirstOrDefault();

您也可以访问 TableB 中的数据,例如:

var tableBId = data.TableB.Id;

【讨论】:

    【解决方案3】:

    您的上下文对象包含所有 Office 对象,如果它们在您的数据库中相关(您说您首先做了一个数据库),那么您可以访问每个 office 对象的 o.Properties 以获取您的属性列表并填充您的视图模型您的存储库方法。

        T YourRepositoryMethod(){
        using(YourEntities dc)
        {
        var offices = dc.Offices;
        var properties = dc.Properties;
    var office1 = dc.Offices.single(o=>o.id == office1id);
        var office1Properties = dc.Properties.Where(p=>p.id == office1._id);
        }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 2021-04-16
      相关资源
      最近更新 更多