2011-02-19 2 views
2

구조적으로 동일하지만 이름 지정 규칙이 서로 다른 엔티티 개체가 여러 개 있습니다 (예 : Products1, Products2, Products3). 이는 레거시 db 스키마의 일부이며 나는 이것에 관해 많은 것을 할 수 없다).이름으로 엔티티 개체 가져 오기 - LINQ to Entities, EF 4.0

이 클래스는 CLR과 관련된 유형이 다르지만 유감스럽게도 디자인 코드가 자동 생성되었으므로 공통점을 보이기 위해이 사람들의 인터페이스를 사용할 수는 없습니다. 그래서, 내 질문은 : 이름으로 엔티티 개체를 검색 할 수있는 방법이 있습니까?

본질적으로 동일한 논리를 이러한 객체에 적용 할 때 기본적으로 스위치/사례 비즈니스를 피하고 싶습니다.

답변

0

우리가 말하는 클래스의 수와 유연성이 얼마나 필요한지에 따라 인터페이스가 문제가되지 않을 수도 있습니다. 나는 제네릭을 사용하여 비슷한 일을했습니다

//WARNING: Partially-remembered code ahead... 
interface IDuckEntity 
{ 
    int FeatherCount { get; set; } 
} 

public partial class Products1 : IDuckEntity { } 
public partial class Products2 : IDuckEntity { } 
public partial class Products3 : IDuckEntity { } 

//in some other class: 
void DoStuff<T>(T entity) where T : EntityObject, IDuckEntity 
{ 
    entity.FeatherCount = 500; 
} 

그래서 기본적으로, 당신은 당신이 인터페이스와 그 작은 부분 클래스 선언의 무리를 넣어 별도의 파일을 설정합니다. 그런 다음 공통 구조에 액세스 할 수 있습니다. 나는 당신의 정확한 상황이 뭔지 모르지만 이것은 나를 위해 매력처럼 일했다.

1

EF4 클래스는 부분 클래스이므로 실제로 확장하고 원하는 인터페이스를 별도의 파일로 구현할 수 있습니다.

대체 방법은 dynamic을 사용하는 것입니다.이 유형을 기반으로 엔티티를 인스턴스화하면됩니다. 또한이 정적으로 입력 된 접근 방식보다 느린, 당신이 실행시에 발견 만 것이다 문제 -

dynamic myEntity= Activator.CreateInstance(Type.GetType("EntityTypeHere"))); 
myEntity.CommonProperty = "Foo"; 

여기에 가장 큰 단점

는 컴파일 타임에 모든 유형의 안전을 잃을 것입니다.

당신은 문제의 개체 또는 개체에 대한 쿼리 표현식 트리를 만들 수
2

: 당신이 객체

물론
public IEnumerable<T> GetResultCollection<T>(int someValue) { 
    MyEntities db = new MyEntities(); 
    var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s")); 

    var param = Expression.Parameter(typeof(T)); 

    var lambda = Expression.Lambda<Func<T, bool>>(
     Expression.Equal(
      Expression.Property(param, "WhateverPropertyYourComparing"), 
      Expression.Constant(someValue)), 
     param); 

    return result.Where(lambda); 
} 

의 컬렉션을 원하는 경우

public T GetSingleObject<T>(int someValue) { 
    MyEntities db = new MyEntities(); 
    var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s")); 

    var param = Expression.Parameter(typeof(T)); 

    var lambda = Expression.Lambda<Func<T, bool>>(
     Expression.Equal(
      Expression.Property(param, "WhateverPropertyYourComparing"), 
      Expression.Constant(someValue)), 
     param); 

    return result.SingleOrDefault(lambda); 
} 

가 또는 원하는 쿼리가 매우 경우 오랜 시간이 걸릴 수 있습니다. Justin Morgan이 제안했듯이 부분 클래스를 사용하여 필요한 인터페이스를 추가하는 것을 고려해야합니다.

이 메서드는 ObjectSet 컬렉션이 개체와 동일한 이름이고 "Invoice"에서 "Invoice"까지의 "s"를 더한 것으로 가정합니다. 그것이 "Person"에서 "People"이 아닌 경우, System.Data.Entity.Design.PluralizationServices.PluralizationService를 사용하여 적절한 이름을 얻을 수 있습니다.

관련 문제