Есть ли что-то похожее на LINQ в Objective-C? - PullRequest
20 голосов
/ 09 января 2009

Интересно, возможно ли (и как) предоставить классу в Objective-C что-то вроде:

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

Это может быть очень удобно для проекта, которым я занимаюсь.

Мне нравится этот способ кодирования, присутствующий в Django & SubSonic.

Ответы [ 6 ]

15 голосов
/ 16 февраля 2013

Я создал свой собственный API в стиле Linq для Objective C, который доступен на github . Ваш конкретный пример будет выглядеть примерно так:

NSArray* results = [[[people where:^BOOL(id person) {
                                return [person id] == 1 && [person id] != 2;
                             }]
                             select:^id(id person) {
                                return [person name];
                             }]
                             sort]; 
6 голосов
/ 09 января 2009

Короткий ответ: в Objective-C нет эквивалента Linq, но вы можете подделать его с помощью сочетания вызовов SQLite, NSPredicate и CoreData в классе-оболочке, созданном по вашему вкусу. Возможно, вас заинтересуют руководство по основным данным , руководство по предикатам и этот пример кода .

Из вышеприведенного руководства по предикатам:

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];
5 голосов
/ 09 января 2009

Существует статья, в которой сравниваются способы Windows и Cocoa. Какао использует ключевые пути и NSPredicate ....

Какао - моя девушка

3 голосов
/ 15 октября 2013

Мой проект, LINQ4Obj-C , портирует стандартные операторы запросов LINQ на Objective-C.

Вы можете найти его на github и его документах здесь . Эта библиотека также доступна через 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, чтобы обеспечить прямой доступ к основным данным.

3 голосов
/ 09 января 2009

Я думаю, что для вашего примера это будет эквивалент в Какао:

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, и некоторые из моих строк могли бы быть объединены, но на мой взгляд, это легче разобрать.

0 голосов
/ 20 марта 2011

Проверьте следующий репозиторий: https://github.com/ziminji/objective-c-sql-query-builder

Эти классы предоставляют набор удобных методов, которые можно использовать для быстрого построения правильно сформированных SQL-запросов для Sqlite. Они довольно просты в использовании и относительно просты, поскольку следуют базовому синтаксису SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...