2015-01-14 1 views
0

저장 프로 시저로 데이터베이스를 쿼리하는 다음 코드가 있습니다. ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable();이 null이 아니면 반환 값은 괜찮습니다. 그러나 Dapper/linq를 통해 컬렉션 유형으로 null 반환을 처리하는 방법을 찾을 수 없습니다. 결과가 null 일 때 더 이상 다중 매핑 된 IEnumerable 목록의 기본값

내 저장 프로 시저

: ReturnObject.familymembers 설정

SELECT states.name as stateName, fam.* 
FROM   Family fam 
WHERE  [email protected] 

SELECT  person.* 
FROM   person 
INNER JOIN Family fam on fam.Id = person.idFamily 
WHERE  [email protected] 

두 번째 SQL 문은 레코드가 어떤 문제를주지 않는다, 그러나 나는 기본을 지정하거나 단정 한에서 널 반환을 처리하는 방법을 알아내는 데 문제가 있어요. 디버깅 할 때 행이 반환되지 않으면 ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable()은 null 예외를 throw합니다.

ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable().DefaultIfEmpty<InternalObjects.Person>();

 public InternalObjects.FamilyDashboard GetDashboardInfo(string username) 
    { 
     InternalObjects.FamilyDashboard ReturnObject = new InternalObjects.FamilyDashboard(); 

     using (var dbConnection = _dbConnectionFactory.CreateConnection()) 
     { 
      using (var multi = dbConnection.QueryMultiple("DashboardSP", new { username = username }, commandType: CommandType.StoredProcedure)) 
      { 
       ReturnObject = multi.Read<InternalObjects.FamilyDashboard>().SingleOrDefault(); 
       ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable(); 

      } 
     } 
     return ReturnObject; 
    } 

내 DTO : 내가 답을 찾았습니다

public class InternalObjects 
{ 
    public class FamilyDashboard 
    { 
     public string physicalAddress1 { get; set; } 
     public string MailingAddress1 { get; set; } 
     public string physicalAddressCity { get; set; } 
     public string physicalAddressZip { get; set; } 
     public string MailingAddressCity { get; set; } 
     public string NumInHousehold { get; set; } 
     public string capidCounty { get; set; } 
     public string physicalUnit { get; set; } 
     public string mailingUnit { get; set; } 
     public string familyPhone { get; set; } 
     public string capCharacteristics { get; set; } 
     public IEnumerable<Person> familymembers {get; set;} 

    } 
    public class Person 
    { 
     public int Id { get; set; } 
     public string firstName { get; set; } 
     public string lastName { get; set; } 
     public string middleName { get; set; } 
     public int gender { get; set; } 
     public DateTime birthdate { get; set; } 
     public string emailPersonal { get; set; } 
     public string SSN { get; set; } 
     public string relationshipName { get; set; } 
     public string primaryLanguageName { get; set; } 

     public int age { get; set; } 

    } 
} 
+0

무엇 코드에 대한로 실행 :

간단한 조건은 하루에 저장 ? 실제로 일어나지 않아야 할 일이 실제로 무엇입니까? – Servy

+0

@Servy - 오류와 관련된 자세한 정보로 내 질문을 업데이트했습니다. – olingern

+0

가족에 가입 한 상태에서 한 곳으로 질문하는 것이 어떨까요? – juharr

답변

0

: 기본적으로

을 여기

내가 일 것이라고 생각하지만 그렇지 않습니다 무엇입니까 , dapper는 반환 된 행이 없으면 내 객체를 인스턴스화하지 않고 값을 반환하지 않습니다. 부모 개체 인 ReturnObject이 인스턴스화되지 않고 계속 실행 중입니다.

다음 줄의 ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable()은 개체에 액세스하려고 시도하지만 DTO가 없습니다. 다른 사람에 대한

if (ReturnObject != null) 
{ 
    ReturnObject.familymembers = multi.Read<InternalObjects.Person>().ToList<InternalObjects.Person>(); 
} 

참조 작동하지 않는 같은! :

How to return null from a Dapper query rather than default(T)?

Getting Dapper to return an empty string instead of a null string