2015-11-03 65 views
0

我想基于一个公共id加入到两个类中,这个id从父表和两个子表中使用lambda/linq生成一行。我在下面粘贴了,到目前为止我尝试过的,但是我得到的是每行10行,这是不正确的。欢迎任何对代码的建议或修改。使用LINQ加入基于公共id的两个类LAMBDA

namespace x 
{ 
    public class IntegrationSearchResult 
    { 
     public string Dfe { get; set; } 
     public SchoolResult SchoolSearchResult { get; set; } 
     public List<PupilResult> PupilSearchResult { get; set; } 
    } 

    public class SchoolResult 
    { 
     public int SupplierId { get; set; } 
     public string SchoolName { get; set; }    
     public DateTime CreateDate { get; set; } 
     public int Pupils { get; set; }  
    } 

    public class PupilResult 
    { 
     public int SupplierId { get; set; }  
     public string FirstName { get; set; } 
     public string LastName { get; set; }   
    } 
} 

功能

private Func<IEnumerable<IntegrationSearchResult>> _getAllDummySearchResults; 
private Func<string, IntegrationSearchResult> _getDfeDummySearchSchool; 

我试图达到的结果

_

getAllDummySearchResults =() => (from dummySupplierId in Enumerable.Range(1, 10)              
    select new IntegrationSearchResult 
    { 
     Dfe = "School-1-" + dummySupplierId.ToString("000000"), 

     SchoolSearchResult = new SchoolResult 
     { 
      SupplierId = dummySupplierId, 
      SchoolName = "SchoolName" + dummySupplierId.ToString("000000"),   
      CreateDate = new DateTime(), 
      Pupils = 123    
     } 
     , 
     PupilSearchResult = new List<PupilResult> 
     { 
      new PupilResult 
      { 
       SupplierId = dummySupplierId,      
       FirstName = "FirstName - Pupil-1-" + dummySupplierId.ToString("000000"), 
       LastName = "LastName - Pupil-1-" + dummySupplierId.ToString("000000") 
      }, 
      new PupilResult 
      { 
       SupplierId = dummySupplierId, 
       FirstName = "FirstName - Pupil-2-" + dummySupplierId.ToString("000000"), 
       LastName = "LastName - Pupil-2-" + dummySupplierId.ToString("000000") 
      } 
     } 
    }).ToList(); 

    _getDfeDummySearchSchool = dfe => 
    { 
     var allSchools = _getAllDummySearchResults(); 
     return allSchools.FirstOrDefault(x => x.Dfe == dfe); 
    }; 

结果预计:学校信息搜索结果应该显示在e行,它是相应的学生,它是两行具有相同的供应商ID。

{ 
    "Dfe": 0, 
    "SchoolSearchResult": [ 
    { 
     "SupplierId": 1, 
     "SchoolName": "SchoolName000001", 
     "CreateDate": "0001-01-01T00:00:00", 
     "Pupils": 123 
    }], 
    "PupilSearchResult": [ 
    { 
     "SupplierId": 1, 
     "FirstName": "FirstName - Pupil-1-000001", 
     "LastName": "LastName - Pupil-1-000001" 
    }, 
    { 
     "SupplierId": 1, 
     "FirstName": "FirstName - Pupil-1-000002", 
     "LastName": "LastName - Pupil-1-000002" 
    }] 
    } 

回答

0

您可以第一个方法更改定义你以下

getAllDummySearchResults =() => (from dummySupplierId in Enumerable.Range(1, 10)              
    select new IntegrationSearchResult 
    { 
     Dfe = "School-1-" + dummySupplierId.ToString("000000"), 

     SchoolSearchResult = new SchoolResult 
     { 
      SupplierId = dummySupplierId, 
      SchoolName = "SchoolName" + dummySupplierId.ToString("000000"),   
      CreateDate = new DateTime(), 
      Pupils = 123    
     } 
     , 
     PupilSearchResult = new List<PupilResult> 
     { 
      new PupilResult 
      { 
       SupplierId = dummySupplierId,      
       FirstName = "FirstName - Pupil-1-" + dummySupplierId.ToString("000000"), 
       LastName = "LastName - Pupil-1-" + dummySupplierId.ToString("000000") 
      }, 
      new PupilResult 
      { 
       SupplierId = dummySupplierId, 
       FirstName = "FirstName - Pupil-2-" + dummySupplierId.ToString("000000"), 
       LastName = "LastName - Pupil-2-" + dummySupplierId.ToString("000000") 
      } 
     } 
    }).Take(1).ToList(); 

它只会从子集选择两个记录,当你调用平等的第二种方法,它会调用第一种方法从子类中获取两行。

+0

您可以在选择两行之前对内部集合进行排序 –

+0

感谢您的回复,但我不想限制结果2.我希望它应该返回可能是从父表(SchoolResult)的10行,并匹配子表的行(PupilResult)。有了这个,我仍然从父表中得到2行,从子表中得到2行有供应商ID 1,2的错误。它应该返回具有相同供应商ID的2行。谢谢 – DotNetGeek

+0

我改变了'拿(2)'到'拿(1)'。它会得到你想要的,但我不知道你正在试图通过这样的查询达到什么目的。如果你可以把你的用例放在一个更好的位置来回答你的问题 –