【发布时间】: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: 我得到了一些对我有用的东西,我正在发布上面的代码。有了这个,我有两个问题
- 这是处理此问题的正确/最佳方法吗?
- 如何改写问题,以便让其他人更好地了解我想要做什么,用几个列表填充模型。
【问题讨论】:
-
你在使用实体框架吗?
-
是的。我正在使用 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