Entity Framework에서 익명의 객체를 질의한 후 도메인 간 액세스를 해결하는 방법
5769 단어 framework
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 모델을 조회하는 방식을 추천한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fragmenta의 각서라고 할까, 그것 밖에 발견되지 않았기 때문에 시도해보기로 했습니다. 다만, 내용을 보면 어플리케이션을 만드는 프레임워크로서 사용되는 것도 의식하고 있는 것 같습니다. 하지만, 지금은 정확하지 않은 것 같기 때문에,...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.