Есть ли что-то похожее на LINQ в Objective-C?
Интересно, возможно ли (и как) предоставить класс в Objective-C с чем-то вроде:
Person.Select(@"Name").OrderAsc(@"Name").Where(@"Id").EqualTo(1).And(@"Id").NotEqualTo(2).Load<Array>
Это может быть очень удобно для проекта, который я делаю.
Мне нравится этот способ кодирования, присутствующий в Django и SubSonic.
Ответы
Ответ 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.