在Objective-C中有类似于LINQ的东西吗?

时间:2009-01-09 15:41:15

标签: objective-c database

我想知道是否有可能(以及如何)在Objective-C中提供类似于:

的类
Person.Select(@"Name").OrderAsc(@"Name").Where(@"Id").EqualTo(1).And(@"Id").NotEqualTo(2).Load<Array>

对于我正在做的项目来说,这可能非常方便。

我喜欢Django&amp; amp;中存在的这种编码方式。亚音速。

6 个答案:

答案 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 guidepredicate guidethis 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 ....

Cocoa is my Girlfriend

答案 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语法。