2010-12-14 5 views
0

작은 제한된 도메인의 개체를 처리하는 아주 간단한 linq 공급자가 있습니다. Linq2Sql의 완벽한 구현은 필요 없지만 SQL 쿼리를 사용해야합니다. 왜냐하면 당신이 테이블과 칼럼의 이름을 보지 않는다면, tree => sql이 매우 (매우) 일반적인 것입니다. Expressiontree to SQL의 일반 구문

Expression<Func<DateTime, bool>> expr = d => d.DateTime.Month == 1 

항상

{0} IS NOT NULL OR {0} = NOW() 

DATEPART({0}, m) = 1 

또는

Expression<Func<DateTime?, bool>> expr = d => d.HasValue || d == DateTime.Now 

로 변환합니다 당신이 포인트를 얻을 수 있기를 바랍니다. 거기에 일반 SQL 생성기가 있나요?

+0

Linq2SQL을 사용하지 않을 이유가 없습니다. – VVS

+0

하지만 다른 중요한 이유 중 하나는 중요한 문제는 런타임시 이전에 테이블과 컬럼 이름을 알지 못해 Linq2Sql에 전달할 dbml 스키마를 만들 수 없다는 것입니다. –

+0

명백한 것은 포인트가 없기 때문에 포인트. 내 세부적인 도메인 문제를 해결하는 방법을 묻지는 않습니다. 그 문제는 아주 잘 작동하고 있으며 OrderBy 메서드와 같은 간단한 요소에 대해 식 트리를 사용하고 있습니다. 뭔가에 대해 나는 조금 긴장하지만 그들은 임의적 인 복합체를 얻을 수 있기 때문에 SQL에 파싱하기위한 휠을 다시 발명하는 것은 어쨌든 너무 일반적이라면 대부분 바보처럼 보인다. –

답변

0

IQueryable Toolkit 및 Matt Warren의 관련 기사 http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx을 살펴 봐야합니다.

+0

실제로 IQueryable Toolkit에 대해 알고 있고 Expression에서 sql을 내보낼 수 있어야하는 SqlFormatter 클래스를 살펴 보았습니다. 어쩌면 내가 소스를 가져와 ORM 기능에 대한 모든 종속성을 제거하고 자신의 코드에서 사용해야합니다. –

1

hehe, 해킹하지 마세요. 그래서, 아직 완전히 작동하지는 않습니다, 나는 매핑 정보를 동적으로 주입하는 방법을 알아야합니다. 그러나 지금까지는 유망 해 보입니다.

나는이 SQL IQToolkit를 사용하여이 코드

var provider = new DbEntityProvider(new SqlConnection(), new TSqlLanguage(), new ImplicitMapping(), new QueryPolicy()); 
var exp = provider.GetTable<Hey>().Where(d => d.Born.Month == 1 || (!String.IsNullOrEmpty(d.Yo) && d.Born == DateTime.Now)).Expression; 
var sql = ((QueryProvider)provider).GetQueryText(exp); 

SELECT t0.[Born], t0.[Yo] 
FROM [Heies] AS t0 
WHERE ((MONTH(t0.[Born]) = 1) OR (NOT (t0.[Yo] IS NULL OR t0.[Yo] = '') AND (t0. 
[Born] = @p0))) 

를 생성 할 수있었습니다 다시 관하여 저를 생각 나게에 대한 데미안 덕분에 이렇게! 누군가 Linq2Sql을 통해 SQL을 생성하는 비슷한 방법이 있다면 IQToolkit에 대한 의존성을 느슨하게 할 수 있으므로 의견을 듣고 싶습니다.

i는 각 매개 변수에 대한 값을 추출에서 벽에 충돌 한 장난을 많이 후 업데이트

. 원본을 많이 읽은 후에는 쿼리를 실제로 실행하기 위해 멀리 숨겨진 것처럼 보입니다. 그래서 아마 난 그냥 그

var xml = Generate<NewsProperty>(); 
var mapping = XmlMappingSource.FromUrl(xml); 
var ctx = new DataContext(new SqlConnection("..."), mapping); 

var query = ctx.GetTable<NewsProperty>().Where(n => n.Date.Year == 2010).OrderBy(n => n.Date).Take(5); 
var cmd = ctx.GetCommand(query); 
string sql = cmd.CommandText; 

foreach (DbParameter param in cmd.Parameters) 
{ 
    sql = sql.Replace(param.ParameterName, param.Value.ToString()); 
} 
에 충실해야한다고, 내가 거의 같은 수행이 코드를 내놓았다/

Linq2Sql에보고 한 후 : 글쎄, 난 쿼리가 실행되지 않게하려면 무엇을 추측