2017-11-10 6 views
1

웹 API 2 프로젝트에서 데이터베이스와 같은 항목을 리턴하는 컨트롤러가 있습니다.문자열을 쿼리 가능 목록에 결합하십시오.

[EnableQuery()] 
public IQueryable<MyList> GetList() 
{ 
    var items = from i in db.Items 
     select new ItemsList() 
     { 
      Id = i.Id, 
      Title = i.Title, 
      cX = i.otherCollection.FirstOrDefault().cX, 
      cY = i.otherCollection.FirstOrDefault().cY 
     }; 
    return items.AsQueryable(); 
} 

예상대로 작동합니다.

아마 추측 할 수 있듯이 otherCollection에는 현재 항목과 관련된 x 행이 포함될 수 있습니다. 현재 나는 FirstOrDefault만을 받고 있습니다. cX 및 cY는 위도 및 Lng 좌표입니다.

이제는 현재 항목과 관련된 otherCollection에서 모든 좌표를 수집하고이를 함수에서 중심점을 찾기 위해 사용할 수있는 LatLng의 결합 된 목록으로 반환해야합니다 (이 함수 나는 가지고있다).

그래서 나는 같은 것을 할 싶습니다 :

var items = from i in db.Items 
    select new ItemsList() 
    { 
     Id = i.Id, 
     Title = i.Title, 
     LatLng = GetCentralGeoCoordinate(i.otherCollection.cX.ToList() + i.otherCollection.cY.ToList()) //IList<GeoCoordinate> geoCoordinates 
    }; 
return items.AsQueryable(); 

i.otherCollection.cXi.otherCollection.cY 두 문자열 값입니다.

어떻게 할 수 있습니까?

+0

'없다 i.otherCollection.cX'와'i.otherCollection.cY'를 비교합니다. 그것들이 같은 타입이라면,'.Concat'을 사용할 수 있습니다. – 12seconds

+0

"중심점"은 무엇을 의미합니까? 몇 가지 예를 보여주십시오. – stybl

+0

@stybl "Centerpoint"는 단순히 FirstOrDefault()에서 하나의 latlng 결과를 반환하는 대신 otherCollection의 항목에서 좌표의 CenterPoint를 찾고 싶다는 것을 의미합니다. otherColection에는 단일 항목에 연결된 좌표가 들어있는 행의 1 ~ 1000 초가 포함됩니다. 하나의 항목은 3000 개의 다른 좌표를 포함하는 3000 개의 행을 otherCollection에 가질 수 있습니다. LatLng 목록을 기반으로하는 함수가있어 하나의 LatLng 값으로 센터를 찾아 반환 할 수 있습니다. – brother

답변

1

GetCentralGeoCoordinate을 IQueryable로 사용할 수 없습니다. 이 함수를 호출하려면 먼저 로컬 메모리에 데이터를 가져와 가져온 시퀀스의 모든 요소에 대해이 함수를 호출해야합니다.

var result = db.Items 
    .Select(item => new ItemsList() 
    { 
     Id = item.Id, 
     ... 
    }) 
    .AsEnumerable()  // bring your items to local memory 
    .Select(item => GetCentralGeoCoordinate(...); 

이제 모든 GeoCoordinate에는 cX와 cY라는 두 가지 속성이 있습니다. 중심 좌표를 찾을 때 어떤 CX가 어떤 CY에 속해야 하는지를 알아야합니다.

var coordinates = (4, 10) (8, 15) (3, 7) ... 

하지

var xCoordintate = 4, 8, 3, ... 
var yCoordinates = 10, 15, 7, ... 

당신의 쿼리은 다음과 같습니다 :

var items = db.Items 
select (item => new ItemsList() 
{ 
    Id = item.Id, 
    Title = item.Title, 
    Coordinates = item.OtherCollection 
     .Select(otherCollectionItem => new Coordinate() 
     { 
      Cx = otherCollectionItem.Cx, 
      Cy = otherCollectionItem.Cy, 
     }) 
     .ToList(), 
} 
.AsEnumerable() 
.Select(fetchedItem => GetCentralGeoCoordinate(fetchedItem.Coordinate)); 

Coordinate 클래스는 CX와 CY 간단한 클래스입니다 당신이 뭔가를 할 수 있습니다. 좌표의 순서를 취할 것입니다 좌표 중심을 계산하는 System.Drawing.Point

함수와 유사하고 반환하는 유일한 중심 좌표 (그리고이 있다면 아마는 null 중심 좌표) 당신은 결합하려는

Coordinate GetCentralGeoCoordinate(IEnumerable<Coordinate> coordinates) 
{ 
    foreach (Coordinate coordinate in Coordinates) 
    { 
     ... // do something with the coordinate 
    } 
} 
+0

아주 좋은 대답입니다! 귀하의 솔루션을 구현하려고하는데 ".AsEnumerable()"에서 오류가 발생합니다 - 'ItemsList에는 AsEnumerable에 대한 정의가 없습니다'? – brother

+0

FWIW, ** 항상 **이 기술을 사용하여 LINQ에서 단일 SQL 쿼리로 직접 변환하기가 너무 번거롭거나 어려운 것을 구현할 수 있습니다. 하지만, 데이터베이스에서 모든 작업을 C# 응용 프로그램으로 옮겨서 IQueryables의 주요 목적 (성능 측면에서)을 극복 할 수 있으므로이 작업을 너무 많이 사용해서는 안됩니다. – SlimsGhost

+0

Nevermind - 그냥 누락되었습니다.) 오류가 발생했습니다. – brother