는 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
을 얻을 수 있습니다.
이미 생성 된 사용자 인스턴스를 전달해야합니까? 아니면'x => new User() {Name = "Jack"}'같은 업데이트 팩토리를 전달할 수 있습니까? –
예. 이전에 생성 된 사용자의 인스턴스를 전달합니다. – hanc
'User' 클래스는'Name'과 다른 속성을 가지고 있습니까? 그렇다면'Update' 메소드는 다른 속성도 업데이트해야합니까? 예를 들어, 'Age' 속성이 있다고 가정하고 업데이트해야합니까? 'Update' 메소드는 업데이트 할 속성을 어떻게 알 수 있습니까? –