좋아요, 그렇게 할게요. 광고를 올릴 계획이었는데 순전히 광고만 올리면 여기저기서 욕설과 벽돌과 계란이 날아다닐 거라고 생각했어요. DAC를 넣어두세요. 사용자 정의 LINQ에 대해 표현식을 지원하는 코드를 설명하겠습니다. 아마도 자신의 데이터 레이어를 작성하거나 실용적인 LINQ 확장을 작성하려는 일부 사람들에게는 도움이 될 것입니다. "제안" 역할을 한다면 좋지 않을까요!
이전 버전의 DAC에서는 쿼리에 다음 식이 사용되었습니다.
IEnumerable<Issue> q = this.dc.Query<Issue>(Issue._.IssueID >= 0);
이 "귀엽다" "_"는 너무 "미성숙"해 보입니다. 특히 LINQ가 만연한 이 시대에는 매우 "시대와 함께 발전"하는 것 같습니다. 그래서 DAC 확장 LINQ를 지원하는 v2.6 버전이 있습니다.
var q = this.dc.Query<Issue>(s => s.IssueID > 0);
또는
var q = from s in (this.dc.GetQueryableData<Issue>())
여기서 s.IssueID > 0
s를 선택하십시오;
위 두 가지 방법의 구현은 주로 표현식 구문 분석과 SQL 문 조합에 의존합니다. Lao Zhao의 게시물은 매우 잘 작성되었으며 DAC의 소스 코드도 볼 수 있습니다(광고를 삽입하고 있습니다).
오늘 제가 주로 말하고 싶은 것은 원래 자체 표현식 트리와 해당 구문 분석 기능이 있다면 LINQ를 지원하도록 쉽게 "업그레이드"할 수 있다는 것입니다. ! 예, 쉽습니다!
var q = SystemUser의 s에서._
여기서 s.FullName == s.FullName.Max
s.UserID별 주문
s.Except(s.Password)를 선택합니다.
개체가 "where", "orderby", "select"가 되도록 허용하려면 DAC에서와 마찬가지로 "Where", "OrderBy", "Select"라는 메서드를 구현하거나 확장 메서드 메서드를 사용하도록 합니다.
공개 정적 클래스 QueryExpressionExtension
{
공개 정적 RaisingStudio.Data.Expressions.IQueryExpression<T> Where<T>(
이 RaisingStudio.Data.Expressions.IQueryExpression<T> 소스,
Expression<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>> 조건자)
{
반환(새 RaisingStudio.Data.Expressions.QueryExpression<T>(
소스.값,
소스.테이블,
(predicate.Compile())(source.Value),
소스.열));
}
공개 정적 RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
이 RaisingStudio.Data.Expressions.IQueryExpression<T> 소스,
Expression<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>> 조건자)
{ … }
공개 정적 RaisingStudio.Data.Expressions.IQueryExpression<T> Select<T>(
이 RaisingStudio.Data.Expressions.IQueryExpression<T> 소스,
식<Func<T, object>> 조건자)
{ ... }
}
메서드 구현 시 들어오는 "system" 표현식에서 Compile 메서드를 호출하여 "custom" 표현식을 반환한 다음, "query"가 실행될 때 "QueryExpression"에 이러한 "custom" 표현식을 저장합니다. 저장된 "사용자 정의" 표현식을 직접 꺼낼 수 있습니다. 이렇게 하면 위 코드의 "사용자 정의" 표현식에 대한 원래 구문 분석을 사용하여 쿼리를 구현할 수 있습니다. ! !