c#
  • .net
  • linq-to-sql
  • 2009-09-29 2 views 1 likes 
    1

    "Where"Linq 기능을 자체 코드에 있어야합니다."Where"내 애플리케이션의 Linq 기능

    설명해 드리겠습니다 : 사용자가 소위 "사용자 코드"를 작성할 수있는 응용 프로그램이 있습니다.이 코드는 C#의 코드로, 응용 프로그램에서 선택하여 런타임에 컴파일되고 실행됩니다.

    사용자 코드에서 SQL 조건을 지정할 수 있어야합니다. 특수한 경우는 날짜 열의 조건입니다. [DateColumn] = '1/1/2001'과 같이 쉽게 구현할 수 있지만 [DateColumn] = GetDate() + 1과 같은 조건이있을 수 있습니다. 후자의 경우 표현을 "이해"하기 위해 파서를 구현해야합니다. 나는 사용자가 무엇이든간에 맹목적으로 SQL을 보내지 않으려합니다 (SQL 주입을 피하십시오).

    xxx.Where(field => field == new DateTime(2001, 1, 1)); 
    xxx.Where(field => field == DateTime.Now.AddDays(1)); 
    

    는 어떤 방식으로 SQL 프레임 워크에 Linq에를 활용할 수 있습니다 :

    사용자는이 같은 Linq에 같은 쿼리를 작성하는 것이 가장 기뻐할 것? 나는 전체 쿼리를 추가로 구성하고 SQL Server로 보내기 위해 뒤에서 생성 된 SQL이 필요합니다.

    나에게 도움이되는 타사 도구가 있습니까?

    전체 IQueryable 인터페이스 (작성, 쿼리 등)가 필요하지 않습니다. 제한이있는 경우에도 System.Linq.Expressions.Expression을 T-SQL로 변환 할 수있는 기능.

    SQL에 대해이 변환 기능을 제공하는 System.Linq. * 네임 스페이스는 무엇입니까? 리플렉터로 몇 가지 힌트를 얻을 수 있을지도 모릅니다.

    대단히 감사합니다.

    +0

    다음 라이브러리는 유망 해 보입니다. http://www.codeplex.com/IQToolkit. –

    답변

    2

    동적 linq라는 샘플 코드가 SDK에 있습니다.

    CS \ 2,008 샘플 \ 당신은 같은 일을 할 수

    하게 DynamicQuery

    \ LinqSamples :

    Northwind db = new Northwind(connString); 
    db.Log = Console.Out; 
    
    var query = 
        db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). 
        OrderBy("CompanyName"). 
        Select("New(CompanyName as Name, Phone)"); 
    

    또 다른 가능성은 사용자의 LINQ 공급자를 구현하는 것입니다. 아주 좋은 예가 "THE WAYWARD WEBLOG"http://blogs.msdn.com/mattwar/pages/linq-links.aspx에서 찾을 수 있습니다. 이 블로그는 내 자신의 사용자 지정 공급자를 구현하는 데 도움이되었습니다.

    public interface IQueryable : IEnumerable {  
        Type ElementType { get; } 
        Expression Expression { get; } 
        IQueryProvider Provider { get; } 
    } 
    
    public interface IQueryProvider { 
        IQueryable CreateQuery(Expression expression); 
        IQueryable<TElement> CreateQuery<TElement>(Expression expression); 
        object Execute(Expression expression); 
        TResult Execute<TResult>(Expression expression); 
    } 
    
    +0

    흠, 내가 정말로 필요한 것은 아닙니다. Expression => T-SQL 문자열을 변환하는 빠른 방법이 필요합니다. –

    +1

    글쎄, 아마 당신은 사용자 지정 Linq Proivder 작성해야합니다. 그것에 대해 아주 좋은 blogpost가 있습니다. 나는 그들도 내 사용자 지정 linq 공급자에 사용됩니다. http://blogs.msdn.com/mattwar/pages/linq-links.aspx – Arthur

    +0

    네, 그게 유일한 방법이라고 생각하기 시작했습니다. 불행히도 필자는 공급자 작성에 대한 경험이 없기 때문에 제 3 자 코드를 기대했습니다. : D –

    0

    나는 이것을 달성하기 위해 Linq의 게으른 평가를 활용할 수 있다고 상상한다. 내가 당신의 질문을 정확하게 이해한다면, 나는 당신이 이렇게 할 수 있다고 생각합니다. LINQ는 게으른이기 때문에이 경우, "userProducts '에서'결과 '를 열거하기 전에

    // Before user code: 
    var products = from p in db.products select p; 
    
    // Insert user-generated code here, such as i.e. 
    userProducts = products.Where(p => price < 1000); 
    
    // After user code: 
    for (var product in userProducts) 
    { 
        Whatever(product); 
    } 
    

    은 실제 SQL 쿼리는 데이터베이스에 발행되지 않습니다.

    +0

    사실, Expression에서 string (T-SQL) 로의 변환 메커니즘 이외의 다른 것은 필요하지 않습니다. –

    0

    필자는 프라이팬과 불에서 뛰어 내리고 있다고 생각합니다. SQL injection을 허용하고 싶지는 않지만 코드 injection을 허용하고 있습니다. C# 코드는 람다라도 부작용을 허용합니다.

    AFAIK, C# 4.0에서는 코드를 동적으로 컴파일 할 수 있습니다. 그러나 사용자가 어리 석거나 악의적 인 일을하지 못하도록 컴파일러 품질 분석을 수행해야합니다.은 SQL 삽입을 방지하기 위해 WHERE 절을 더 쉽게 마사지합니다.

    +0

    제가 말하고있는 어플리케이션은 악의적 인 방식으로 작동하지 않도록 보안 강화의 여러 레이어가있는 큰 하나입니다. 코드는 샌드 박스에서 실행되며 매우 작은 그룹의 사용자 (관리자) 만 사용자 코드 작성 등에 액세스 할 수 있습니다. 따라서 "코드 삽입"은 의도적으로 설계된 것입니다. "관련성이 없습니다."왜이 기능과 모든 가능한 보안 의미가 필요하지만 내 질문은 "어떻게"할 수 있었는지입니다. 나는이 목적을 위해 내 자신의 QueryProvider를 만들 수 있다는 것을 알고 있지만, 나는 그것을 수행하는 가장 검증 된 방법을 찾고 있었다. –

    +1

    ... 사실 SQL 주입은 문제가 아닙니다. 나는 사용자가 'drop table'명령을 쓰지 않겠다는 것을 꽤 많이 믿을 수 있지만, 시스템의 기본 구현 (SQL 코드 작성)을 엉망으로 만들지는 않을 것 "이라고 덧붙였다. 그것은 강력한 필터를 만들기위한 간단한 API를 제공하는 것입니다. –

    +0

    나는 이해한다. 그럼에도 불구하고 SQL 또는 C#을 사용자에게 직접 노출해야한다고 생각하지 않습니다. 당신은 사용자와 데이터 사이에 추상 (UI) 레이어를 두었습니다. 추상화를 SQL 또는 C#으로 변환했는지 여부는 구현 세부 사항입니다. 후자의 경우, .NET은 4.0 또는 3.에서 컴파일러를 노출한다고 생각합니다. – XXXXX

    관련 문제