2016-07-26 2 views
3

이 함수에 대한 일반적인 메서드를 만들고 매개 변수와 같은 사용자 클래스와 where 절을 보내려합니다..net 제네릭 메서드 매개 변수가있는 Iterable <T> 및 식 <Func<T, T>>

public void Update(where clause, User user) {} 

하지만 올바른 방법을 찾을 수 없습니다.

ctx.Users.Where(x => x.Id == 10) 
     .Update(x => new User() { Name = "Jack" }); 

방법 선언은 다음과 같습니다 당신이 이미 생성 User 인스턴스를 전달하는 경우

public static int Update<T>(this IQueryable<T> query, Expression<Func<T, T>> updateFactory) where T : class; 
+0

이미 생성 된 사용자 인스턴스를 전달해야합니까? 아니면'x => new User() {Name = "Jack"}'같은 업데이트 팩토리를 전달할 수 있습니까? –

+0

예. 이전에 생성 된 사용자의 인스턴스를 전달합니다. – hanc

+0

'User' 클래스는'Name'과 다른 속성을 가지고 있습니까? 그렇다면'Update' 메소드는 다른 속성도 업데이트해야합니까? 예를 들어, 'Age' 속성이 있다고 가정하고 업데이트해야합니까? 'Update' 메소드는 업데이트 할 속성을 어떻게 알 수 있습니까? –

답변

0

Update 방법은 예를 들어, 그것은 그들 모두 업데이트해야합니다 (업데이트 할 수있는 특성을 알 수 없을 것입니다? 또는 기본값이 아닌 값을 가진 속성? 속성이 의도적으로 기본값으로 설정되면 어떻게됩니까?).

멤버 초기화 표현식이 포함 된 Expression<Func<T, T>> 표현식을 전달해야합니다. x => new User() { Name = "Jack" }.

표현식은 코드로서의 데이터입니다. 내부적으로 프레임 워크는 표현식을 파싱하고 어떤 속성이 업데이트 될지 확인합니다. 예제의 경우 Name 속성 만 업데이트하려고한다는 것을 알 수 있습니다.

where 식은 Expression<Func<User,bool>>을 전달해야합니다.

public void Update(
    Expression<Func<User,bool>> condition, 
    Expression<Func<User,User>> updateFactory) 
{ 
    ctx.Users 
     .Where(condition) 
     .Update(updateFactory); 
} 

을 그리고 당신은 다음과 같이 사용할 수 있습니다 : : 그래서 방법은 다음과 같을 것이다

Update(x => x.Id == 10, x => new User() { Name = "Jack" }); 

편집 :

업데이트 할 속성을 찾을 수있는 방법이있는 경우, 다음과 같은 표현식을 작성할 수 있습니다.

public static void Update(
    Expression<Func<User, bool>> condition, 
    User user, 
    PropertyInfo[] propertiesToUpdate) 
{ 
    Expression<Func<User, User>> updateFactory = 
     Expression.Lambda<Func<User, User>>(
      Expression.MemberInit(
       Expression.New(typeof (User)), 
       propertiesToUpdate 
        .Select(prop => 
         Expression.Bind(
          prop.SetMethod, 
          Expression.Constant(prop.GetValue(user))))), 
      Expression.Parameter(typeof(User), "u")); 

    ctx.Users 
     .Where(condition) 
     .Update(updateFactory); 
} 

속성 이름 만 가지고 있다면 Type.GetProperty 메서드를 사용하여 해당 PropertyInfo을 얻을 수 있습니다.

+0

객체 사용자 만 전달하고 함수를 사용하여 표현식을 생성하면 어떻게 할 수 있습니까? 속성이 다음과 같이 설정되었는지 확인하고 싶습니다 :'var entry = _Context.Entry (entity); foreach (entry.OriginalValues.PropertyNames의 var 속성) { var 원본 = entry.OriginalValues.GetValue (속성); var current = entry.CurrentValues.GetValue (속성); if (original! = null &&! original.Equals (current)) {--- 속성 변경이 표현식에 연결 } } – hanc

+0

답을 업데이트했습니다. 업데이트 할 속성을 가져올 수 있으면 직접 식을 만들 수 있습니다. –

관련 문제