2009-09-11 2 views
4

날짜 행을 행 밖으로 가져와야하는 linq 쿼리가 있습니다. 이Linq - null 쿼리 결과에서 값 가져 오기

myObject.OrderByDescending(s=> s.MyDate).Where(s => s.CRAStatus.Description == "CheckedOut").FirstOrDefault().MyDate) 

문제는 행이없는 경우 "CheckedOut는"쿼리는이 null을 리턴하고 "MyDate가"예외가 발생합니다 얻기 위해 시도하는 것입니다 같은 표현은 현재 보인다. 다음과 같은 자세한 솔루션이 있습니다.

.ForMember(dest => dest.CheckOutDate, opt => opt.MapFrom(src => { 
    var temp = src.CRAStatusChangeEvents.OrderByDescending(s=> s.MyDate).Where(s => s.CRAStatus.Description == "CheckedOut").FirstOrDefault(); 
    return temp == null ? temp.MyDate : null; 
})); 

하지만 조금 더 간결한 것을 찾는 것이 좋습니다. 어떤 아이디어?

+1

1 : 유지 보수 및 가독성에 대한 간결하고 싶은 사람들을 볼 항상 좋은 코드 ... – RSolberg

답변

4

myObject.OrderByDescending(s=> s.MyDate) 
     .Where(s => s.CRAStatus.Description == "CheckedOut") 
     .Select(s => s.MyDate as DateTime?) 
     .FirstOrDefault(); 

또는

myObject.Where(s => s.CRAStatus.Description == "CheckedOut") 
     .Max(s => s.MyDate as DateTime?); 
+0

지금은 멋지고 깨끗합니다 !!! –

+0

"DateTime?"을 잊지 마세요. 추가하지 않으면 NRE를 얻게됩니다. – Ruben

+0

아주 좋습니다! Ruben에게 감사드립니다! – jlembke

1
var checkedOut = myObject.Where(s => s.CRAStatus.Description == "CheckedOut"); 
if (checkedOut.Count() > 0) { 
    var result = checkedOut.Max(s=> s.MyDate).MyDate; 
} 
+0

checkedOut을 대체 할 수 있습니다. ! 가독성을 높이기 위해! checkedOut.Empty()를 0 이상으로 계산하십시오. –

+0

이 경우에는 두려워 할 수 없습니다. IEnumerable

3

하나의 옵션은 "빈"인스턴스에 default if empty을 설정하는 것입니다 (String.Empty로 생각 - 빈 결과를 나타낸다는 알려진 인스턴스) : 여기

var date = (myObject 
    .OrderByDescending(s=> s.MyDate) 
    .Where(s => s.CRAStatus.Description == "CheckedOut") 
    .DefaultIfEmpty(MyObject.Empty) 
    .FirstOrDefault()).MyDate; 

은 단편이다 그 작동 방식을 보여줍니다 :

var strings = new string[]{"one", "two"}; 
var length = 
    (strings.Where(s=>s.Length > 5) 
    .DefaultIfEmpty(string.Empty) 
    .FirstOrDefault()).Length; 

실행 길이가 0입니다. DefaultIfEmpty 라인을 제거하면 NRE를 얻습니다.

+0

+1 for DefaultIfEmpty() ... 그 중 하나에 대해 알지 못했습니다 –

+0

그 방법을 찾았을 때 행복하고 행복한 하루였습니다. 젠장, 내 인생은 공허하다. – Will

+0

내 뒷주머니에 하나 넣어. 멋지다. – jlembke

1

연장 방법은 어떻습니까?

static class MyObjectEnumerableExtensions 
{ 
    public static TMember GetMemberOfFirstOrDefault<TMember>(this IEnumerable<MyObject> items, Func<MyObject, TMember> getMember) 
    { 
     MyObject first = items.FirstOrDefault(); 
     if (first != null) 
     { 
      return getMember(first); 
     } 
     else 
     { 
      return default(TMember); 
     } 
    } 
} 

샘플 사용 :

List<MyObject> objects = new List<MyObject>(); 
objects.Add(new MyObject { MyDate = DateTime.MinValue }); 

var filteredObjects = from s in objects where s.MyDate > DateTime.MinValue select s; 

DateTime date = filteredObjects.GetMemberOfFirstOrDefault(s => s.MyDate); 

Console.WriteLine(date);