복붙노트

[SQL] LINQ 쿼리의 SQL 사용자 정의 함수를 호출

SQL

LINQ 쿼리의 SQL 사용자 정의 함수를 호출

나는 힘든 시간을 일이 점점 데. 나는 된 IQueryable에 다음과 같은 필터 도우미를 사용하여 반경 검색을 수행하려합니다. RadiusSearch 적용 전에 적용받을 다른 필터의 세트가있다. 목표는 조회가 ToList () 작업까지 연기 할 얻을 때문에 순서는별로 중요하지 않아야합니다.

public static IQueryable<ApiSearchCommunity> RadiusSearch(this IQueryable<ApiSearchCommunity> communities)
{
    var centerLatitude = 30.421278;
    var centerLongitude = -97.426261;
    var radius = 25;

    return communities.Select(c => new ApiSearchCommunity()
    {
        CommunityId = c.CommunityId,
        City = c.City,
        //Distance = c.GetArcDistance(centerLatitude, centerLongitude, c.Latitude, c.Longitude, radius)
    });
}

어떻게 든 다시 SQL에 UDF 호출하는 위 GetArcDistance 같은 도우미를 쓸 수 있습니까? 내가 생성하기 위해 노력하고 쿼리는 다음과 같다

SELECT 
    comms.community_id, 
    comms.city, 
    comms.distance 
FROM (
    SELECT 
        c.community_id, 
        c.city, 
        dbo.udf_ArcDistance(
            30.421278,-97.426261, 
            c.community_latitude,
            c.community_longitude
        ) AS distance 
    FROM communities c) AS comms 
WHERE comms.distance <= 25 
ORDER BY comms.distance

해결법

  1. ==============================

    1.좋아, 내가 질문을 이해 생각 - 그것의 요점은 당신이 당신의 Linq에 엔티티에 대한 쿼리의 일환으로 SQL UDF를 호출 할 수 있도록하려는 것입니다.

    좋아, 내가 질문을 이해 생각 - 그것의 요점은 당신이 당신의 Linq에 엔티티에 대한 쿼리의 일환으로 SQL UDF를 호출 할 수 있도록하려는 것입니다.

    먼저 데이터베이스 모델을 사용하는 경우입니다 :

    이 문서에서는 작업을 수행하는 방법에 대해 설명 : http://msdn.microsoft.com/en-us/library/dd456847(VS.100).aspx

    그것을 요약하면, 당신에게 edmx에서 XML 편집기에서 edmx 파일 편집에 대한 최초의 필요성 : 당신은 당신의 SQL UDF에 매핑을 지정해야합니다 StorageModels >> 스키마 부분, 예를 들어,

    <Function Name="SampleFunction" ReturnType="int" Schema="dbo">
        <Parameter Name="Param" Mode="In" Type="int" />
    </Function>
    

    그럼 당신은 그것에 EdmFunction 속성이 같은 뭔가 정적 기능 어딘가를 작성해야합니다 :

    public static class ModelDefinedFunctions
    {
        [EdmFunction("TestDBModel.Store", "SampleFunction")]
        public static int SampleFunction(int param)
        {
          throw new NotSupportedException("Direct calls are not supported.");
        }
    }
    

    이 방법은 엔티티 프레임 워크에 의해 쿼리 시간에 UDF에 매핑 얻을 것이다. 첫 번째 속성 인수는 저장 공간 - 당신은 스키마 요소에 대한 당신의 edmx XML 파일 (네임 스페이스에 대한보기)에서이를 찾을 수 있습니다. 두 번째 인수는 UDF의 이름입니다.

    그런 다음이 같은 호출 할 수 있습니다 :

    var result = from s in context.UDFTests
                select new
                {
                    TestVal = ModelDefinedFunctions.SampleFunction(22)
                };
    

    도움이 되었기를 바랍니다.

  2. ==============================

    2.여기 증거, 또 다른 하나 - 당신은 코드 - 첫 번째 접근 방식을 사용하는 경우 (EF6 현재) 원하는대로, 당신은 UDF를 호출 할 수 없습니다. 당신은 당신의 SQL 쿼리의 일환으로 UDF를 호출 제한됩니다 :

    여기 증거, 또 다른 하나 - 당신은 코드 - 첫 번째 접근 방식을 사용하는 경우 (EF6 현재) 원하는대로, 당신은 UDF를 호출 할 수 없습니다. 당신은 당신의 SQL 쿼리의 일환으로 UDF를 호출 제한됩니다 :

    bool result = FooContext.CreateQuery<bool>(
        "SELECT VALUE FooModel.Store.UserDefinedFunction(@someParameter) FROM {1}",
        new ObjectParameter("someParameter", someParameter)
    ).First();
    

    이는 IMO 추한 및 오류가 발생하기 쉬운입니다.

    또한 -이 MSDN 페이지는 말한다 :

    이는 기본적으로 당신이 전화 UDF에에 모델 첫 번째 방법을 사용 할 필요가 있다는 것을 의미합니다.

  3. from https://stackoverflow.com/questions/20131632/calling-a-sql-user-defined-function-in-a-linq-query by cc-by-sa and MIT license