2011-01-21 4 views
1

내 응용 프로그램은 클라이언트가 서버에 특정 지역의 개체를 요청하는 클라이언트 - 서버 설정입니다. 서버 x와 y 좌표와 반경을 보냅니다. 그런 다음 서버는 지정된 영역의 개체에 대해 SQL Server 데이터베이스를 쿼리해야합니다. 데이터베이스에서 개체는 x 및 y 좌표로 저장됩니다.Linq To SQL의 간단한 절차

먼저 메서드를 WCF를 통해 서버에 전달 된 Region 개체에서 시도했습니다. 물론 메서드를 T-SQL로 변환 할 수 없어 작동하지 않습니다. 하지만 간단한 람다 표현식은 LINQ 쿼리에 사용되는 볼 수 있었다, 그래서 나는이 시도 :

 Func<UniverseStationaryObject, RegionLocation, bool> contains = 
     (universeObject, location) => Math.Sqrt(
      Math.Pow(universeObject.locationX - location.x, 2) + 
      Math.Pow(universeObject.locationY - location.y, 2) 
      ) <= location.radius; 

     var objects = from o in dataContext.UniverseStationaryObjects 
         where contains.Invoke(o, Location) 
         select o; 

불행히도,이 작동하지 않았다 중 - 나는 일부 기능은 SQL 쿼리 Linq에 허용됩니다 읽었습니다 ,하지만 수학 함수가 그들 사이에 있지 않나요? 이를 위해 저장된 함수가 필요합니까? 저장된 함수는 어떻게 생겼을까요? (필자는 T-SQL로 작성한 적이 없다)? 함수에 C# 객체를 전달하고 db 서버에 전달할 모든 값을 추출하지 않아도됩니까? 내 말은, linq-to-sql 클래스 디자이너에 저장된 함수를 추가 할 때 객체를 허용하고 그 시점에서 값을 추출 할 수 있습니까?

모든 개체를 검색하여 C#으로 필터링하는 옵션은 아닙니다.

답변

1

System.Data.Linq.CompiledQuery.Compile()을 사용하여 을 컴파일 된 쿼리로 만들어야합니다. 작동하려면 쿼리를 약간 수정해야합니다. I는 다음과 같이 일하는 것이 믿습니다 또한

Func<MyDataContext, UniverseStationaryObject, RegionLocation, bool> contains = 
    CompiledQuery.Compile(
     (MyDataContext dc, UniverseStationaryObject universeObject, RegionLocation location) => 
      Math.Sqrt(
       Math.Pow(universeObject.locationX - location.x, 2) + 
       Math.Pow(universeObject.locationY - location.y, 2) 
      ) <= location.radius); 

var objects = from o in dataContext.UniverseStationaryObjects 
       where contains(dataContext, o, Location) 
       select o; 

참조 : Creating reusable chunks of LINQ to SQL

+0

우, 멋진 :) 슬프게도 내가 나서서 이미 저장 기능을 할 :(하지만이 시도거야 방법을 배웠습니다 너무 –