2017-03-27 3 views
1

나는 DbSets 모의 쓰기를 마치고 이와 같은 일련의 코드를 작성했습니다.일반 메서드 추출

int rowCount = 0; 
var maxOrderId = EntityContainer.Set<Order>().Max(a => a.Id); 
var newOrders = EntityContainer.Set<Order>().Where(a =>a.Id == 0); 
foreach (var order in newOrders) 
{ 
    order.Id = ++maxOrderId; 
    rowCount++; 
} 

var maxServiceId = EntityContainer.Set<Service>().Max(a => a.Id); 
var newServices = EntityContainer.Set<Service>().Where(a => a.Id == 0); 
foreach (var service in newServices) 
{ 
    service.Id = ++maxServiceId; 
    rowCount++; 
} 

이 목록에는 더 많은 항목이 있습니다. 이들을 일반적인 방법으로 추출 할 수있는 방법이 있습니까? 같은 뭔가 :

int GenerateID<Order>(); 

내가 dynamic를 사용하여 시도,하지만 컴파일러는 역학은 람다 식에 사용할 수 없습니다 뿌려줍니다.

interface IItem 
{ 
    int Id { get; set; } 
} 

GenerateId 방법은 다음과 같을 것이다 :

int GenerateID<T>(int rowCount) where T : IItem 
{ 
    var maxId = EntityContainer.Set<T>().Max(a => a.Id); 
    var newItems = EntityContainer.Set<T>().Where(a => a.Id == 0); 
    foreach (T item in newItems) 
    { 
     item.Id = ++maxId; 
     rowCount++; 
    } 

    return rowCount; 
} 

편집

하는 방법에 대해 당신은 당신의 객체가 같은 인터페이스를 구현 보장해야

+0

를 사용하지만, 당신이하십시오 자체 구현을 시작하기 전에 https://github.com/tamasflamich/effort를 확인 했습니까? –

답변

1

인터페이스를 추가하지 않아도됩니다. LD 패스 접근 기능/행동 :

int GenerateId<T>(int rowCount, Func<T, int> getIdFunc, Action<T, int> setIdFunc) 
    where T : class 
{ 
    var maxId = EntityContainer.Set<T>().Max(getIdFunc); 
    var newItems = EntityContainer.Set<T>().Where(a => getIdFunc.Invoke(a) == 0); 
    foreach (T item in newItems) 
    { 
     setIdFunc.Invoke(item, maxId++); 
     rowCount++; 
    } 

    return rowCount; 
} 

는 다음과 같은 전화 :

rowCount = GenerateId<Order>(rowCount, o => o.Id, (o, id) => o.Id = id); 
rowCount = GenerateId<Service>(rowCount, o => o.Id, (o, id) => o.Id = id); 
+0

Id가 – Raghav

+0

인 클래스/인터페이스의 Contraint를 사용하지 않는 한 유효한 회원이되지 않습니다. 'T'에 'Id'가 없으므로 작동하지 않습니다. 'T'는 인터페이스가 있어야합니다. –

+0

그 뜻은, 나는 모든 수업을 IItem 인터페이스로 확장해야합니까 ?? – Raghav

0

난 당신이 모델에 대한 자동 증가 ID가 필요를 잘 이해합니다.

그냥이

public class Model 
{ 
    private static int m_Counter = 0; 
    // 
    public static ResetCounter(int start) 
    { 
     m_Counter=start; 
    } 
    public int Id { get; set; } 

    public Model() 
    { 
     this.Id = System.Threading.Interlocked.Increment(ref m_Counter); 
    } 
} 

처럼 떨어지게를 사용하기 시작 ID를 설정하려는 경우 또한이 answer

을보고 당신에게 어쩌면 케이스 관련이없는

Model.ResetCounter(maxServiceId)//optionally 
new Model {} //now When you create new object Model.Id should increment by itself