Linq:项目结果

Linq:项目结果,linq,linq-to-sql,.net-3.5,Linq,Linq To Sql,.net 3.5,基本上,我有很多公司可以有很多办公室,我如何让我的查询显示这一点,我有: 在我看来,问题是,我在下面的例子中检索了一家公司3次,当我只接收一家公司和多个办公室时,我的查询是不是完全错了 //companies = _repo.All<Companies>(); //mainoffice = _repo.All<Office>(); var dto = companies .Join(mainoffice, x => x._ID

基本上,我有很多公司可以有很多办公室,我如何让我的查询显示这一点,我有: 在我看来,问题是,我在下面的例子中检索了一家公司3次,当我只接收一家公司和多个办公室时,我的查询是不是完全错了

//companies = _repo.All<Companies>();
//mainoffice = _repo.All<Office>();

        var dto = companies
           .Join(mainoffice, x => x._ID, y => y.CompanyID, (x, y) => new
            {
                mycompany = x,
                myoffice = y,
            })
            .Select(x => new
                {
                    ID = x.mycompany._ID,
                    Offices = x.myoffice
                }); 
更新:又有1个嵌套结果集

        var areascovered = repo.All<OfficePostCode>();

        var filter = repo.All<PostCodeDistrict>()
            .Where(x => x.Region.StartsWith(postcode))
            .Join(areascovered, x => x.PostCodeID, y => y.PostCodeID, (x, y) =>
                 new
                 {
                     Postcode = x.PostCode,
                     Region = x.Region,
                     OfficeID = y.OfficeID
                 });

        var mainoffice = repo.All<Office>();

        var dto = companies
            .Select(company => new
            {
                ID = company._ID,
                Offices = mainoffice.Select(office => new
                {
                    CompanyID = office.CompanyID,
                    Name = office.Name,
                    Tel = office.Tel,
                    RegionsCovered = filter.Where(f => f.OfficeID == office.OfficeID)
                })
                .Where(y => y.CompanyID == company._ID)// && y.RegionsCovered.Any())
            })
            .Where(pair => pair.Offices.Any());

您不需要连接,只需要嵌套选择。请尝试以下方法:

from company in companies
select new
{
   ID = company._ID,
   Offices = mainoffice.Where(office => office.CompanyID == company._ID)
}
如果您不想输入没有办公室的公司,请尝试以下方法:

from company in companies
let offices = mainoffice.Where(office => office.CompanyID == company._ID)
where offices.Any()
select new
{
   ID = company._ID,
   Offices = offices
}
显式lambda版本点符号:

第一个:

companies.Select(company => new
{
    ID = company._ID,
    Offices = mainoffice.Where(office => office.CompanyID == company._ID)
});
无办公室的公司,已移除:

companies.Select(company => new
{
    ID = company._ID,
    Offices = mainoffice.Where(office => office.CompanyID == company._ID)
})
.Where(pair => pair.Offices.Any());

没有必要加入公司和办公室,在这种加入中,你可以看到每个公司都有办公室,我想你可以试试下面的方法:

companies.SelectMany(x=>x.Offices).Select(x=>new {ID = x.CompanyID, Office = x})

我假设你在每个办公室都有公司ID

如果你还想有一个完整的公司,你可以这样做

var officeGroups = 
    offices.GroupBy(x=>x.CompanyID).Select( x=>new {ID = Key, Offices = x});

var result = from c in companies
               join o in officeGroups on c.ID equals o.ID
               select new {Company = c, Offices = o.Offices};

在您的第一个示例中,什么是办公室,您是指主办公室吗?此外,使用您的示例将导致我失去对companies@Haroon我想你办公室有桌子,对吗?Office指的是这个表。事实上,这两个例子都使我失去了对公司的引用,我需要公司,因为它包含了我需要向UII投射的其他信息。我认为我的第二个例子更适合您。@Haroon在您的示例中,您以公司ID投射,你想拥有一个完整的公司吗?@lassepeholt-有lamdba版本吗?@Haroon好了:我还没有测试过,但我认为可以。事实上,它们都是lambda,第一个是查询语法,第二个是点符号。@SaeedAmiri是的,但我想大家都知道Haroon的意思。但是名称改变了:@lasseSpeholt-如果我想要另一个嵌套结果选择,我会像上面一样进行选择,但是当我检查它生成的sql时,它看起来不像是一个调用,可以进行一次调用吗?所以对于办公室,我有区域
offices.GroupBy(x=>x.CompanyID).Select( x=>new {ID = Key, Offices = x});
var officeGroups = 
    offices.GroupBy(x=>x.CompanyID).Select( x=>new {ID = Key, Offices = x});

var result = from c in companies
               join o in officeGroups on c.ID equals o.ID
               select new {Company = c, Offices = o.Offices};