2011-03-06 6 views
2
//my question is here 
public static Query Where<TElement>(this Query query, Func<TElement, bool> predicate) 
{ 
    query.sql +=" FROM Table WHERE "+ predicate+";"; 
    return query; 
} 

//Query class 
public class Query 
{ 
    public Query(){} 
    public Query(string sql){this.sql = sql;} 
    public string sql { set; get; } 
} 

//User class 
public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

//example: 
User user = new User() { ID=1,Name="test"}; 
Query query = new Query(); 
query = query.Where<User>(u=>u.ID==user.ID); 
Console.WriteLine(query.sql); 

실행 한 후, 결과는<TElement, 부울> 술어

FROM Table WHERE ID=1; 

누군가가 나를 도울 수 있습니까?

+0

이 부분이 어디서 나왔는지 설명 할 수 있습니까? 'u => u.ID == user.ID'. 일치하는 ID 만주고 싶다면 원하는 ID가 무엇입니까? –

+0

먼저, 술어를 구문 분석하려면'Expression >'형식이어야합니다. 다음 질문은 이것으로 당신의 의도 된 목표입니까? Linq To Sql을 질문 태그처럼 사용한다면 왜 'Where'를 재발 명하고 있습니까? –

+0

나는 linq가 어떻게하는지 알고 싶다 – artwl

답변

3

Linq to SQL이 SQL 쿼리를 작성하는 방법을 배우려면 먼저 Expression Trees에 대해 알아야합니다.

다음 단계는 ExpressionVisitor에 익숙해지며 표현 트리에서 각 부분을 방문하는 방법을 알려줍니다.

블로그에서 일련 번호 "LINQ: Building an IQueryable provider series"을 읽은 후 SQL에서 표현식 트리를 구문 분석하는 방법을 살펴 봅니다.

게시물 "Where and reusable Expression tree visitor"은 귀하의 술어를 구문 분석하는 방법을 도와줍니다.

이제 IQueryable<T>.Where()와 함께 작동하지 않을 것이기 때문이다 그러나이 글에서 단지 Expression<Func<T, bool>> 모든 것이 완전히 관련이하지만 where 절 유효한 SQL에 조건 식을 구문 분석하는 방법에 좋은 시작이 될 것이다.

희망이 있으면 시작하실 수 있습니다!

+0

귀하의 레퍼런스가 나의 것보다 훨씬 낫습니다. 질문자, 대신이 링크를 클릭하십시오! – Jollymorphic

+0

Edulinq에 대한 링크가 여기 유용 할 것이라고 생각하십니까? 그것은 Linq2Objects를 설명하지만 Linq가 일반적으로 어떻게 구현되는지에 대한 훌륭한 개요를 제공합니다. http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx 필자는 단지 새로운 질문을 추가하고 싶지 않았지만 유용하다고 판단되면 자유롭게 편집 할 수 있습니다. . 격려 –

1

쿼리 클래스를 LINQ에 액세스 가능하게 만드는 중입니다. LINQ Where 절에 참여할 때 얻을 수있는 술어는 문자열이 아닌 함수 개체입니다. 아이디어는 열거하고 반환하는 각 요소에 조건 자 함수를 적용하여 함수에서 "참"을 반환하는 요소 만 반환한다는 것입니다.

LINQ-to-SQL은 이와 같은 술어 내부의 코드를 조사합니다.이 코드는 분석하여 SQL 표현식으로 변환 할 수있는 표현식 (예 : 람다)으로 간주됩니다. 컴파일러는 C# 람다를 표현식에서 예상되는 유형에 따라 델리게이트 또는 표현식 트리 (this MSDN topic 참조)로 컴파일러에서 생성 할 수 있습니다. 따라서 LINQ-to-SQL은 많은 작업을하고 있습니다. 단어를 사용하여 해당 술어를 데이터베이스 엔진에 대해 실행할 수있는 것으로 바꾼다.

정말로 LINQ를 사용한다면 쿼리의 모든 레코드를 가져온 다음 스케일링 문제가 아니라면 조건부를 사용하여 필터를 필터링해야합니다 (앱이 얼마나 심각한가에 따라 다름). 또한 IEnumerable 객체를 반환하고 yield-return을 사용하는 적절한 Where 함수를 작성해야합니다. this tutorial page (꽤 많이 아래로 스크롤해야 함)을 참조하거나 Nutshell 책의 우수한 C#에서 LINQ 챕터를 읽으십시오.

반면에 LINQ에 대해 실제로 신경 쓰지 않고이 코드가 LINQ-y 인 경우에는 인수 유형을 string으로 변경하고 사용할 표현식을 따옴표로 묶으십시오.