제 3 자의 SQL Server 데이터베이스에서 가져온 데이터를 사용하는 작은 응용 프로그램을 만들었습니다.Entity Framework Core에서 테이블의 관련 데이터를 문자열로 포함합니다.
ObjectId, Unid, Name, Description 등의 가장 일반적인 데이터를 유지하는 'Objecten'이라는 테이블에는 'ObjectType'이 있습니다. VARCHAR/스트링 인 컬럼과 같은 예 'VRIJ1OBJECT
', 'VRIJ2OBJECT
', 'HARDWARE
'용
「VRIJ1OBJECTEN
」, 「VRIJ2OBJECTEN
','HARDWARE
' .
내 (ASP.NET 코어) 코드에서 EF Core 2.0을 사용하고 있습니다. 관련된 데이터 ()가있는 객체의 페이지 목록을 반환하려고 시도하지만 문자열 이름을 사용하여 테이블에 가입하는 방법을 알지 못합니다.
현재 페이지에 대해 10 개의 개체를 반환 할 때 11 개의 쿼리를 수행합니다. 1을 사용하여 10 개의 오브젝트를 가져오고 각 오브젝트에 대해 1을 사용하여 ObjectType에 따라 관련 데이터를 테이블에서 가져옵니다. 약 3 초가 걸리는 반면 1 회의 쿼리에는 약 200ms가 소요됩니다. API는 훨씬 빨라야합니다.
일부 코드 :
private async Task<(List<ObjectViewModel> objecten, int totaalAantalObjecten)> _getTopDeskObjectenAsync(string q = null, string sort = "Naam-", int take = 0, int skip = 0, string e = null, bool qall = false, string categorie = "", RolstoelZoekenVM rolstoelZoekenVm = null, bool aotCategorie = false, AotZoekenVM aotZoekenVm = null)
{
var objecten = await _db.Object.Where(o => o.Status != -1).ToListAsync();
... (paging, filtering, ...) ...
var returnObjecten = new List<ObjectViewModel>();
foreach (var o in objecten){
returnObjecten.Add(await _dbObjectToViewModelAsync(o));
}
return (returnObjecten, totalCount);
}
private async Task<ObjectViewModel> _dbObjectToViewModelAsync(TopDeskDatabase.Object o)
{
var vrijObject = await GetDbVrijObjectAsync(o);
return new ObjectViewModel
{
... filling up the VM properties ...
}
}
// THIS should be done by the SQL Server in the query
public async Task<IVrijobject> GetDbVrijObjectAsync(TopDeskDatabase.Object o)
{
switch(o.Type.ToLower())
{
case "vrij1object":
return await _db.Vrij1object.FirstOrDefaultAsync(d => d.Objectid == o.Unid);
case "vrij2object":
return await _db.Vrij2object.FirstOrDefaultAsync(d => d.Objectid == o.Unid);
case "vrij3object":
return await _db.Vrij3object.FirstOrDefaultAsync(d => d.Objectid == o.Unid);
case "vrij4object":
return await _db.Vrij4object.FirstOrDefaultAsync(d => d.Objectid == o.Unid);
case "vrij5object":
return await _db.Vrij5object.FirstOrDefaultAsync(d => d.Objectid == o.Unid);
case "hardware":
return await _db.Hardware.FirstOrDefaultAsync(d => d.Objectid == o.Unid);
case "inventaris":
return await _db.Inventaris.FirstOrDefaultAsync(d => d.Objectid == o.Unid);
case "telefonie":
return await _db.Telefonie.FirstOrDefaultAsync(d => d.Objectid == o.Unid);
}
throw new InvalidDataException($"Object '{o.RefNaam}' is van type '{o.Type}', welke niet VRIJxOBJECT, INVENTARIS, TELEFONIE of HARDWARE is!");
}
기본적으로 사용자 지정 식별자가있는 TPT 계층 구조가 있지만 C# 모델 클래스의 형식 계층 구조로 모델링되지 않았습니다? – grek40
'Type'이 다른 경우 관련된 모든 테이블에서 'Unid'가 고유하거나 다른 항목에 동일한 'Unid'값이 있습니까? – grek40
첫 번째 코멘트에서 무엇을 말했는지는 알지 못합니다.하지만 아마도 이것이 내가 가진 것입니다. Unid는 객체의 Unid입니다. 동일한 Unid가 '형식 테이블'에 있습니다. 예를 들어 unid를 선택하고 object => {guid : 3F2504E0-4F89-11D3-9A0C-0305E82C3301을 입력하고 'VRIJ1OBJECT'를 입력 한 다음 vrij1objecten에서 관련 데이터를 선택합니다. 여기서 objectunid = '3F2504E0-4F89-11D3-9A0C-0305E82C3301'=> 이것은 객체에 대한 올바른 관련 데이터를 반환합니다. – AppSum