我想知道是否有可能(以及如何)在Objective-C中提供类似于:
的类Person.Select(@"Name").OrderAsc(@"Name").Where(@"Id").EqualTo(1).And(@"Id").NotEqualTo(2).Load<Array>
对于我正在做的项目来说,这可能非常方便。
我喜欢Django&amp; amp;中存在的这种编码方式。亚音速。
答案 0 :(得分:15)
我为Objective C创建了自己的Linq风格的API,即available on github。您的具体示例如下所示:
NSArray* results = [[[people where:^BOOL(id person) {
return [person id] == 1 && [person id] != 2;
}]
select:^id(id person) {
return [person name];
}]
sort];
答案 1 :(得分:6)
简短的回答是没有与Objectiveq C的Linq等效,但你可以在一个根据自己喜好的包装类中混合使用SQLite,NSPredicate和CoreData调用来伪造它。您可能对core data guide,predicate guide和this example code感兴趣。
从上面的谓词指南:
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Employee"
inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
// assume salaryLimit defined as an NSNumber variable
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"salary > %@", salaryLimit];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
答案 2 :(得分:5)
有一篇文章比较了Windows和Cocoa的做法。 Cocoa使用Key Paths和NSPredicate ....
答案 3 :(得分:3)
我认为特定于你的例子,这在Cocoa中是等价的:
NSArray *people = /* array of people objects */
NSPredicate *pred = [NSPredicate predicateWithFormat:@"Id = 1 AND Id != 2"];
NSSortDescriptor *byName = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
NSArray *descriptors = [NSArray arrayWithObject:[byName autorelease]];
NSArray *matches = [people filteredArrayUsingPredicate:pred];
NSArray *sortedMatches = [matches sortedArrayUsingDescriptors:descriptors];
NSArray *justNames = [sortedMatches valueForKey:@"Name"];
它比LINQ示例更冗长,我的一些行可能已合并但在我看来这更容易解析。
答案 4 :(得分:3)
我的项目 LINQ4Obj-C ,将LINQ标准查询运算符移植到Objective-C。
您可以在github及其docs here找到它。该库也可通过CococaPods获得。
此项目的源代码在标准MIT许可下可用。
你的例子看起来像这样:
id results = [[[people linq_where:^BOOL(id person) {
return ([person ID] == 1);
}] linq_select:^id(id person) {
return [person name];
}] linq_orderByAscending];
NB 我删除了第二个条件(ID!= 2),因为它毫无意义。
目前,库为集合类提供扩展方法(类别),但将来我还会将其功能扩展到NSManagedObjectContext
,以提供对核心数据的直接查询访问。
答案 5 :(得分:0)
查看以下存储库:https://github.com/ziminji/objective-c-sql-query-builder
这些类提供了一组便捷方法,可用于为Sqlite快速构建格式良好的SQL查询。它们使用起来非常简单,而且相对简单,因为它们遵循基本的SQL语法。