如何使用LINQ语句填充多个列表

时间:2013-11-27 04:09:11

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

我有一个包含两个列表的viewmodel。一个是属性表,一个是该属性的办公室信息。在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

这将为我提供与该物业相关的所有物品和所有物业信息。如果我有以下viewmodel:

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; }
}

我怎样才能用属性。*和带办公室的办公室列表填写属性列表。*等?

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

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

编辑2: 关于真实世界应用程序的说明,我正在尝试对我们的内部系统进行属性搜索。我想要一堆基于标准的属性,或者只提供一个属性id。

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

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

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. 我如何改写这个问题,以便让其他人更好地了解我的目标,填写一个带有几个列表的模型。

3 个答案:

答案 0 :(得分: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) });

答案 1 :(得分:0)

考虑你有两张桌子。一个是父表'TableA'和子表'TableB' TableB 包含 TableA 的一个外键。

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

编写查询时

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

您可以从TableB访问数据,如:

var tableBId = data.TableB.Id;

答案 2 :(得分:0)

您的上下文对象包含所有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);
    }
    }