2017-12-20 14 views
0

간단히 말해서 수행 할 작업은 CSOM을 사용하는 SharePoint Project Server의 프로젝트에서 작업을로드하는 것입니다.정의되지 않은 수의 값을 비교하기위한 동적 람다 식 작성

var projects = ctx.LoadQuery(ctx.Projects 
     .Where(p => p.Id == projGuid) 
     .Include(
      p => p.Id, p => p.Name, 
      p => p.Tasks 
       .Where(t => t.Id == taskGuid) 
       .Include(t => t.Name)) 
       ); 

ctx.ExecuteQuery(); 

내 문제는이 부분 .Where(t => t.Id == taskGuid) 함께. 그것은 단지 1 개의 작업을로드하고 싶지만 더 많은 작업을로드하려는 경우 작동하지 않아야하는 방식으로 작동합니다. 물론 그것을 쓸 수있다. .Where(t => t.Id == taskGuid1 || t.Id == taskGuid2 || ...)

그러나 그것은 동적이지 않다. 내가 뭘하려

배열 및 배열 GuidArray.Contains(p.Id)

경우 모양을 사용하는 것이었다 그러나 나는 Where() 표현 내부 .Contains()를 사용하려고하면 오류가 발생합니다.

ClientRequestException : '포함'멤버를 식에 사용할 수 없습니다.

로드하고 싶은 작업의 수를 기반으로 람다 식을 어떻게 든 만들 수 있다면 생각했습니다. 람다의 창조

+0

FirstOrDefault()를 사용하고 null이 아닌지 확인할 수 있습니까? 아니면 Any()를 사용할 수 있습니까? – LordWilmore

+0

데이터베이스가 얼마나 잘 수행되는지에 따라 달라 지지만 빠르면 ID가있는 배열을 만들고 물마루를 루프 할 수 있습니다. –

답변

1

I 관해서는, 당신은 동적를 만들거나이가 된 IQueryable 만 지원하거나 나는 보통 무엇을하고하지 포함하면

과 같이
public static class ExpressionExt 
    { 
     public static IQueryable<T> Where<T,TKey>(this IQueryable<T> data, string prop,params TKey[] guids) 
     { 
      var param = Expression.Parameter(typeof(T)); 
      var exp = guids.Select(g => Expression.Equal(Expression.Property(param, prop), Expression.Constant(g))).Aggregate((a, e) => a != null ? Expression.Or(e, a) : e); 
      var lambda = Expression.Lambda<Func<T, bool>>(exp, param); 

      return data.Where(lambda); 
     } 
    } 

찾고있는 상태와 Where(nameof(A.Id), guids)처럼 사용 . 거기에 구현이 포함될 수 있으므로 문서를 확인하십시오.