Подтвердить что ты не робот

Есть ли что-то похожее на LINQ в Objective-C?

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

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

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

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

4b9b3361

Ответ 1

Короткий ответ заключается в том, что Linq для Objective-C не эквивалентен, но вы можете подделать его с помощью сочетания вызовов 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];

Ответ 2

Я создал собственный 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]; 

Ответ 3

Существует таблица, сравнивающая способы использования Windows и Cocoa. Cocoa использует Key Paths и NSPredicate....

Cocoa - моя подруга

Ответ 4

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

Ответ 5

Мой проект 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.

Ответ 6

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

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