MongoDB C# 드라이버의 QueryBuilder 확장
"ClassA.MemberA.MemberB"와 같은 문자열을 직접 하드코딩하고 싶지 않기 때문에 다음과 같은 일반적인 시나리오에 대해 다음 클래스를 작성했습니다. 🎜 >1. 표현식을 문자열 함수로 변환: ExpToStr()
2. 컬렉션 함수: 컬렉션 멤버가 있는 경우 이 클래스를 사용할 수 있으며 이 클래스의 코드가 추가됩니다. 3. CollectionAs 함수: 상속이 사용되는 경우 기본 클래스를 하위 클래스로 변환하고 하위 클래스의 QueryCollection
을 반환하려고 합니다. 사용 예: //获得表达式的字符串形式
1. QueryEx<ClassA>.ExpToStr ((ClassA m)=> m.MemberA.MemberB.MemberC)
//集合.成员.字段
//PoppedSegments为集合,AssignedNetwork.Name为成员
//将返回PoppedSegments.AssignedNetwork.Name
2. QueryEx<MDDelivery>.Collection(x => x.PoppedSegments).Matches(p => p.AssignedNetwork.Name, bsonRegex),
//子类集合.成员.字段
//STPaymentTransaction为基类,STPaymentCompanyCredit为子类,Company字段在子类中
//将返回Payments.Company.Name
3. QueryEx<MDDelivery>.CollectionAs<STPaymentTransaction, STPaymentCompanyCredit>(x=>x.Payments).Matches(p=>p.Company.Name, bsonRegex)
//集合.集合.成员.字段
//Parcels为集合,STCustomPropertyRuntime为基类,STNumericPropertyRuntime为子类,CustomProps为STNumericPropertyRuntime中成员,Value为CustomProp中成员
//将返回Parcels.CustomProps.Value
4. QueryEx<MDDelivery>.Collection(x=>x.Parcels).CollectionMemberAs<STCustomPropertyRuntime, STNumericPropertyRuntime>(p=>p.CustomProps).Matches(p=>p.Value, bsonRegex),
public class QueryEx<TDocument> { public static QueryCollection<TDocument, TCollection> Collection<TCollection>( Expression<Func<TDocument, IEnumerable<TCollection>>> collectionExpression) { return new QueryCollection<TDocument, TCollection>(collectionExpression); } //for those cases using inheritance //e.g STPaymentTransaction //Payments will return STPaymentTransaction //need to cast to sub classes(STPaymentCompanyCredit) so that be able to filter by child members (e.g. Company) public static QueryCollection<TDocument, TSub> CollectionAs<TCollection, TSub>( Expression<Func<TDocument, IEnumerable<TCollection>>> collectionExpression) where TSub : TCollection { var argParam = Expression.Parameter(typeof (TDocument), "x"); var memberStr = ExpToStr(collectionExpression); MemberExpression nameProperty = Expression.Property(argParam, memberStr); var subExp = Expression.Convert(nameProperty, typeof(IEnumerable<TSub>)); var exp = Expression.Lambda<Func<TDocument, IEnumerable<TSub>>>( subExp, argParam); return new QueryCollection<TDocument, TSub>(exp); } /// <summary> /// return string value for a expression: /// for s.Name.Val1.Val2 will return Name.Val1.Val2 /// </summary> /// <typeparam name="MDClass"></typeparam> /// <typeparam name="Member"></typeparam> /// <param name="exp"></param> /// <returns></returns> public static string ExpToStr<TDocument, Member>(Expression<Func<TDocument, Member>> exp) { return new QueryExpressionHelper().MemberExpression(exp); } } public class QueryCollection<TDocument, TCollection> { private readonly QueryExpressionHelper _queryExpression; private string _collectionName; public string Context { get { return _collectionName; } } public QueryCollection(Expression<Func<TDocument, IEnumerable<TCollection>>> collectionExpression) { _queryExpression = new QueryExpressionHelper(); _collectionName = _queryExpression.MemberExpression(collectionExpression); } public QueryMember<TCollection, TMember> Member<TMember>(Expression<Func<TCollection, TMember>> exp) { var expStr = QueryEx<TCollection>.ExpToStr(exp); var context = string.Format("{0}.{1}", _collectionName, expStr); var obj = new QueryMember<TCollection, TMember>(context); return obj; } public QueryCollection<TCollection, TMember> CollectionMember<TMember>( Expression<Func<TCollection, IEnumerable<TMember>>> exp) { var expStr = QueryEx<TCollection>.ExpToStr(exp); var obj = new QueryCollection<TCollection, TMember>(exp) { _collectionName = string.Format("{0}.{1}", _collectionName, expStr) }; return obj; } /// <summary> /// this method only support 1 layer nested(not for Query Collection.Collection , but for Collection.Member) /// if member is collection and need convert to sub class /// </summary> /// <typeparam name="TMember">Base Type</typeparam> /// <typeparam name="TMemberSub">Child Class Type</typeparam> /// <param name="collectionExpression"></param> /// <returns></returns> public QueryCollection<TCollection, TMemberSub> CollectionMemberAs<TMember, TMemberSub>( Expression<Func<TCollection, IEnumerable<TMember>>> collectionExpression) where TMemberSub : TMember { var obj = QueryEx<TCollection>.CollectionAs<TMember, TMemberSub>(collectionExpression); obj._collectionName = string.Format("{0}.{1}", _collectionName, obj._collectionName); return obj; } public IMongoQuery LT<TMember>(Expression<Func<TCollection, TMember>> memberExpression, TMember value) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.LT(string.Format("{0}.{1}", _collectionName, memberName), BsonValue.Create(value)); } public IMongoQuery LT<TValue>(Expression<Func<TCollection, IEnumerable<TValue>>> memberExpression, TValue value) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.LT(string.Format("{0}.{1}", _collectionName, memberName), BsonValue.Create(value)); } public IMongoQuery EQ<TMember>(Expression<Func<TCollection, TMember>> memberExpression, TMember value) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.EQ(string.Format("{0}.{1}", _collectionName, memberName), BsonValue.Create(value)); } public IMongoQuery EQ<TValue>(Expression<Func<TCollection, IEnumerable<TValue>>> memberExpression, TValue value) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.EQ(string.Format("{0}.{1}", _collectionName, memberName), BsonValue.Create(value)); } public IMongoQuery NE<TMember>(Expression<Func<TCollection, TMember>> memberExpression, TMember value) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.NE(string.Format("{0}.{1}", _collectionName, memberName), BsonValue.Create(value)); } public IMongoQuery NE<TValue>(Expression<Func<TCollection, IEnumerable<TValue>>> memberExpression, TValue value) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.NE(string.Format("{0}.{1}", _collectionName, memberName), BsonValue.Create(value)); } public IMongoQuery In<TMember>(Expression<Func<TCollection, TMember>> memberExpression, params TMember[] values) { return In<TMember>(memberExpression, new List<TMember>(values)); } public IMongoQuery In<TMember>(Expression<Func<TCollection, TMember>> memberExpression, IEnumerable<TMember> values) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.In(string.Format("{0}.{1}", _collectionName, memberName), values.Select(x => BsonValue.Create(x))); } public IMongoQuery In<TCastC, TMember>(Expression<Func<TCastC, TMember>> memberExpression, IEnumerable<TMember> values) where TCastC : TCollection { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.In(string.Format("{0}.{1}", _collectionName, memberName), values.Select(x => BsonValue.Create(x))); } public IMongoQuery In<TValue>(Expression<Func<TCollection, IEnumerable<TValue>>> memberExpression, IEnumerable<TValue> values) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.In(string.Format("{0}.{1}", _collectionName, memberName), values.Select(x => BsonValue.Create(x))); } public IMongoQuery In<TCastC, TValue>(Expression<Func<TCastC, IEnumerable<TValue>>> memberExpression, IEnumerable<TValue> values) where TCastC : TCollection { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.In(string.Format("{0}.{1}", _collectionName, memberName), values.Select(x => BsonValue.Create(x))); } public IMongoQuery Matches<TMember>(Expression<Func<TCollection, TMember>> memberExpression, BsonRegularExpression value) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.Matches(string.Format("{0}.{1}", _collectionName, memberName), value); } public IMongoQuery Matches<TValue>(Expression<Func<TCollection, IEnumerable<TValue>>> memberExpression, BsonRegularExpression value) { var memberName = _queryExpression.MemberExpression(memberExpression); return Query.Matches(string.Format("{0}.{1}", _collectionName, memberName), value); } } public class QueryMember<TDocument, TCollection> { private readonly QueryExpressionHelper _queryExpression; private string _collectionName; public string Context { get { return _collectionName; } } public QueryMember(Expression<Func<TDocument, TCollection>> exp) { _queryExpression = new QueryExpressionHelper(); _collectionName = _queryExpression.MemberExpression(exp); } public QueryMember(string context) { _collectionName = context; } } public class QueryExpressionHelper { public string Context; public string MemberExpression<TMember>(Expression<TMember> expression) { MemberExpression me; switch (expression.Body.NodeType) { case ExpressionType.MemberAccess: me = expression.Body as MemberExpression; break; case ExpressionType.Convert: dynamic convertedBody = expression.Body; me = convertedBody.Operand as MemberExpression; break; default: throw new NotSupportedException(string.Format("Member with node type {0} is not supported. expression {1}", expression.Body.NodeType, expression)); } var stack = new Stack<string>(); while (me != null) { stack.Push(me.Member.Name); me = me.Expression as MemberExpression; } var expStr = string.Join(".", stack.ToArray()); return expStr; } } public static class QueryMoney { public static IMongoQuery Value(string name, double val) { var accuracy = 0.005; return Query.And( Query.LT(name, new BsonDouble(val + accuracy)), Query.GT(name, new BsonDouble(val - accuracy))); } }
위 내용은 MongoDB C# Driver의 QueryBuilder를 확장한 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

C# 및 .NET 런타임은 개발자가 효율적이고 강력하며 크로스 플랫폼 개발 기능을 강화하기 위해 긴밀히 협력합니다. 1) C#은 .NET 프레임 워크와 완벽하게 통합하도록 설계된 유형 안전 및 객체 지향 프로그래밍 언어입니다. 2) .NET 런타임은 C# 코드 실행을 관리하고, 쓰레기 수집, 유형 안전 및 기타 서비스를 제공하며, 효율적이고 크로스 플랫폼 운영을 보장합니다.

C# .NET 개발을 시작하려면 다음과 같은 것이 필요합니다. 1. C#의 기본 지식과 .NET 프레임 워크의 핵심 개념을 이해하십시오. 2. 변수, 데이터 유형, 제어 구조, 기능 및 클래스의 기본 개념을 마스터하십시오. 3. LINQ 및 비동기 프로그래밍과 같은 C#의 고급 기능을 배우십시오. 4. 일반적인 오류에 대한 디버깅 기술 및 성능 최적화 방법에 익숙해 지십시오. 이러한 단계를 통해 C#.NET의 세계를 점차적으로 침투하고 효율적인 응용 프로그램을 작성할 수 있습니다.

C#과 .NET의 관계는 분리 할 수 없지만 같은 것은 아닙니다. C#은 프로그래밍 언어이며 .NET은 개발 플랫폼입니다. C#은 코드를 작성하고 .NET의 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행되는 데 사용됩니다.

C#.NET은 여러 응용 프로그램 개발을 지원하는 강력한 도구 및 라이브러리를 제공하기 때문에 여전히 중요합니다. 1) C#은 .NET 프레임 워크를 결합하여 개발 효율적이고 편리하게 만듭니다. 2) C#의 타입 안전 및 쓰레기 수집 메커니즘은 장점을 향상시킵니다. 3) .NET은 크로스 플랫폼 실행 환경과 풍부한 API를 제공하여 개발 유연성을 향상시킵니다.

C#.NETISVERSATILEFORBOTHWEBBANDDESKTOPDEVENTROMMENT.1) FORWEB, useASP.NETFORRICHINTERFACES.3) FORDESKTOP.3) USEXAMARINFORCROSS-PLATFORMDEEVENTRIMMENT, LINABILEDEV, MACODEDEV, and MACODEDOWS, 및 MACODEDOWS.

C# 및 .NET는 지속적인 업데이트 및 최적화를 통해 신흥 기술의 요구에 적응합니다. 1) C# 9.0 및 .NET5는 레코드 유형 및 성능 최적화를 소개합니다. 2) .NETCORE는 클라우드 네이티브 및 컨테이너화 된 지원을 향상시킵니다. 3) ASP.NETCORE는 최신 웹 기술과 통합됩니다. 4) ML.NET는 기계 학습 및 인공 지능을 지원합니다. 5) 비동기 프로그래밍 및 모범 사례는 성능을 향상시킵니다.

C#.netissuitable forenterprise-levelapplications는 richlibraries, androbustperformance, 그러나 itmaynotbeidealforcross-platformdevelopmentorwhenrawspeediscritical, wherelanguagesslikerustorthightordogrordogrognegrognegrognegrognecross-platformdevelopmentor.

.NET에서 C#의 프로그래밍 프로세스에는 다음 단계가 포함됩니다. 1) C# 코드 작성, 2) 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행됩니다. .NET에서 C#의 장점은 현대적인 구문, 강력한 유형 시스템 및 .NET 프레임 워크와의 긴밀한 통합으로 데스크탑 응용 프로그램에서 웹 서비스에 이르기까지 다양한 개발 시나리오에 적합합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)
