2010-08-24 6 views
1

부울 표현식을 데이터베이스에 저장하고 평가하려고합니다. 완전한 표현식 트리를 저장할 필요는 없습니다. 아마도 문자열이 그것을 할 것입니다. 예를 들어 Criteria (expression_to_evaluate, value_to_return)문자열로 저장된 표현식 평가

,의 내가 20, 40 사이에 나이가 사람과 일치하는 표현이 있다고 가정 해 봅시다 :로 대체되어야 할 것이다

(var >= 20 AND var <= 40) 

var

나는 이런 방식을 상상 문제의 사람의 나이. 일치하는 것이 있으면 그 행을 반환해야합니다. 일치하지 않으면 다음 행을 고려하여 해당 표현식을 평가해야합니다. 심지어 두 변수 어쩌면 ((var >= 20 AND var <= 40) OR (var < 10))

:

과 같은 더 복잡한 표현이있을 수 ((var1 <= 10) AND (var2 >= 10 OR var1 == 20))

이 는 SQL (SQL 서버 2005/2008) 또는 C#을 하나에서 수행해야합니다. 일치하는 행의 값을 반환하고 C#에서 처리해야합니다.

이것도 가능합니까?

+2

경고 : Sql이 경고를주지 않고 유해한 항목을 실행하기 때문에 저장하기 전에 식을 유효화해야합니다. –

+0

나는 그걸 생각해 봤는데 어떤 종류의 검증이 필요하다. 그러나 그것을 지적 해 주셔서 감사합니다. –

답변

1

EXECUTE | EXEC을 사용하면 먼저 T-SQL 문자열을 작성한 다음 실행할 수 있습니다. 변수에 따라 문자열을 먼저 작성한 다음 간단히 EXEC 문자열을 작성하는 논리를 수행 할 수 있습니다.

동일한 줄에서 C#에서 동일한 작업을 수행하고 ExecuteNonQuery() 또는 ExecuteReader()을 사용하여 T-SQL을 실행할 수 있습니다.

+0

나는 그런 생각조차하지 않았다. 실제로 솔루션처럼 들리지만 필요한 변수의 수를 결정하는 방법은 궁금합니다. 어떻게 든 C# (전달할 매개 변수)에서 평가할 식으로 매핑해야합니다. 어떤 아이디어? –

+0

꽤 복잡해 질 수 있습니다. 누군가가 이것을 탐구 한 코드 프로젝트 기사가 있습니다 : http://www.codeproject.com/KB/database/Building_Dynamic_SQL.aspx – Codesleuth

0

Visual Studio 코드 샘플에 깊이 숨겨져있는 System.Linq.Dynamic 내용을 일반적인 linq-to-sql과 함께 사용하십시오. 지정된 속성 이름은 생성 된 엔티티 클래스에 매핑됩니다.

myContext.MyTable.Where("Property > 20 && Property < 40").ToList(); 
+1

Linq.Dynamic에 대해 들어 본 적이 없으며,이 경우에는 꽤 유용하게 들립니다. 나는 그것을 사용할 수 있을지도 모른다. 평가 방법에 대해 아십니까? 그것은 DBMS에 의해 수행됩니까? SQL 주입 공격은 어떻습니까? –

+0

이 문자열을 일반 표현 트리로 변환하는 파서입니다. 데이터베이스와 관련이 없으며 쿼리 된 개체의 속성과 비교하여 평가됩니다. Dynamic Linq에 관련된 데이터베이스는 없으며 linq-to-sql 일 수있는 기본 IQueryable 구현에 전달되는 표현식 트리 만 생성합니다. SQL 인젝션을 피하는 것은 IQueryable 구현의 책임입니다. – sisve

관련 문제