Entity Framework에서 익명의 객체를 질의한 후 도메인 간 액세스를 해결하는 방법

5769 단어 framework
Entity Framework에서는 lambda 표현식을 사용하여 데이터에 대한 조회를 할 수 있고 조회 결과를 대상이나 대상 목록으로 직접 비추어 개발 속도를 크게 높일 수 있으며 데이터 층의 데이터를 더욱 편리하게 처리하고 전달할 수 있다.그러나 많은 경우에 우리는 전체 테이블의 필드를 모두 찾아낼 필요가 없다. 만약에 우리가 전체 데이터 실체를 직접 조회하면 성능에 큰 영향을 미치기 때문에 우리는 익명의 대상을 조회하거나 이미 정의된 방식으로 데이터베이스에 대해 조회해야 한다.
1. 인스턴스에 사용되는 데이터 엔티티 클래스:
 
public  class Category
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}

2. 조회
만약 우리가 현실적인 분류 디렉터리를 필요로 한다면, 우리는 Id와Name 두 필드만 있으면, 새로운CategoryView를 만들 수 있다
public class CategoryView
{
public int Id { get; set; }
public string Name { get; set; }
}

 
질의할 때 CategoryView 목록을 직접 생성할 수 있습니다.
var data1 = from c in context.Categoriees
select new CategoryView()
{
Id = c.Id,
Name = c.Name
};

 
이렇게 하면 방법 반환 값을 IQueryable 형식으로 설정하고 호출 방법에서 직접 훑어볼 수 있습니다.
그러나 CategoryView가 없을 때는 익명의 객체로만 질의할 수 있습니다.
var data = from c in context.Categoriees
select new
{
cId = c.Id,
cName = c.Name
};

 
이러한 쿼리 후에도 cId와 cName을 통해 직접 값을 얻을 수 있지만, 현재 방법 내부에서만 접근할 수 있으며, 전역적으로 접근하면 cId와 cName의 값을 직접 읽을 수 없습니다.
Category Service 클래스의 구현은 다음과 같습니다.
namespace ConsoleApplication1
{
public class CategoryService
{
private ShopContext context=new ShopContext();

public IQueryable<object> GetAllCategories()
{
var data = from c in context.Categoriees
select new
{
cId = c.Id,
cName = c.Name
};
return data;
}
}
}

호출 방법:
CategoryService service=new CategoryService();
IQueryable<object> data = service.GetAllCategories();

 
이때 우리는 Object 유형의 속성 값을 직접 읽을 수 없다. 성능을 고려하지 않는 전제에서 우리는 반사를 사용하여 속성 값을 얻을 수 있다.
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
CategoryService service=new CategoryService();
IQueryable<object> data = service.GetAllCategories();
foreach (var item in data)
{
Type type = item.GetType();
PropertyInfo idProperty = type.GetProperty("cId");
string id = idProperty.GetValue(item, null).ToString();
PropertyInfo nameProperty = type.GetProperty("cName");
string name = nameProperty.GetValue(item, null).ToString();

Console.WriteLine("Id:"+id+" Name:"+name);
}
Console.ReadKey();
}
}
}

 
물론 이런 조작은 성능의 문제가 CategoryView 모델을 구축해야 하는 것보다 훨씬 번거롭지 않다고 생각하면 비교적 간단하고 빠른 실현 방식이지만 제 건의는 CategoryView와 같은 보기 모델 유형을 구축하여 이런 대상을 보기에 직접 전달할 수 있다는 것입니다. 왜 기꺼이 하지 않겠습니까!!!

3. 지금까지 내가 알고 있는 가장 좋은 크로스 접근 방식


c#4.0에dynamic 특성을 추가하여 우리는 동적 유형에 대한 해석을 지원할 수 있다. c#언어는 절대적으로 정적 유형이지만dynamic는 컴파일할 때 구체적인 유형을 추정하지 않고 표현식수로 전개하는 형식을 통해 가장 나중에 실행하는 동안 에이전트를 사용하여 호출을 실행하는 방법은 익명 형식에 대한 호출이 반사 메커니즘을 사용하는 것보다 더욱 효율적이고 편리하기 때문에위 인스턴스의 경우 다음과 같이 호출할 수 있습니다.
foreach (dynamic item in data)
{
Console.WriteLine(item.cId);
}

 
우리가 잃어버린 것은 비주얼 스튜디오의 스마트 힌트일 뿐이다. 그래서 현재로서는 이것이 가장 적당한 방법이다. 물론 UI 층과 연결된 서비스 층이라면 View 모델을 조회하는 방식을 추천한다.

좋은 웹페이지 즐겨찾기