2009-01-09 105 views
20

我不知道是否有可能(以及如何)提供的Objective-C類的東西,如:在Objective-C中是否有類似於LINQ的東西?

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

這可能是一個項目,我做的非常得心應手。

我喜歡這種編碼方式存在於Django & SubSonic。

+2

我很喜歡Objective-C中的LINQ等價物。有人應該寫一個! – 2010-05-11 18:08:42

+2

@JonathanSterling - 我有! https://開頭github上。com/ColinEberhardt/LinqToObjectiveC – ColinE 2013-02-15 22:01:38

回答

6

簡短的回答是Objective-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]; 
3

我認爲,具體到您的例子,這會是可可中的等價物:

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例子更詳細和我的一些線條可能已經組合起來了,但在我看來這更容易解析。

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]; 
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以提供對Core Data的直接查詢訪問。

相關問題