2009-01-09 21 views
20

Me pregunto si es posible (y cómo) para proporcionar una clase en Objective-C con algo como:¿Hay algo similar a LINQ en Objective-C?

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

que podría ser muy útil para un proyecto que estoy haciendo.

Me gusta esta forma de codificación presente en Django & SubSonic.

+2

Me encantaría un equivalente LINQ en Objective-C. ¡Alguien debería escribir uno! –

+2

@JonathanSterling - ¡Tengo! https: // github.com/ColinEberhardt/LinqToObjectiveC – ColinE

+1

@JonathanSterling, compruebe LINQ4Obj-C disponible en GitHub: https://github.com/michalkonturek/LINQ4Obj-C. Puede encontrar documentos aquí: http://cocoadocs.org/docsets/LINQ4Obj-C/1.0.0/ –

Respuesta

6

La respuesta corta es que no hay un equivalente a Linq para Objective-C, pero puede simularlo con una combinación de llamadas SQLite, NSPredicate y CoreData en una clase de contenedor configurada a su gusto. Probablemente le interesen core data guide, predicate guide y this example code.

De lo anterior guía predicado:

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

pienso específico para su ejemplo este sería el equivalente en cacao:

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"]; 

Es un poco más detallado que el ejemplo y LINQ algunas de mis líneas podrían haberse combinado, pero a mi juicio esto es más fácil de analizar.

0

revisa el siguiente repositorio: https://github.com/ziminji/objective-c-sql-query-builder

Estas clases proporciona un conjunto de métodos de conveniencia que puede ser utilizado para construir consultas SQL bien formados rápidamente para SQLite . Son bastante simples de usar y son relativamente sencillos ya que siguen la sintaxis SQL básica.

15

Creé mi propia API de estilo Linq para Objective C, que es available on github. Su ejemplo específico sería algo como esto:

NSArray* results = [[[people where:^BOOL(id person) { 
           return [person id] == 1 && [person id] != 2; 
          }] 
          select:^id(id person) { 
           return [person name]; 
          }] 
          sort]; 
+0

¿Bajo qué licencia está disponible su biblioteca? ¿Puedo usarlo en un software comercial? –

+1

@Zoidberg - buen punto, no había indicado una licencia. Acabo de actualizar el proyecto para incluir una licencia de MIT, por lo que esto debería estar bien para uso comercial. – ColinE

+0

Esto es realmente bueno, es muy similar a linq excepto que parece que estás usando métodos anónimos en lugar de predicados. –

3

Mi proyecto, LINQ4Obj-C, puertos LINQ consulta estándar operadores a Objective-C.

Lo puede encontrar en github y su docs here. Esta biblioteca también está disponible a través del CococaPods.

El código fuente de este proyecto está disponible bajo la licencia estándar de MIT.

Tu ejemplo podría mirar esto:

id results = [[[people linq_where:^BOOL(id person) { 
    return ([person ID] == 1); 
}] linq_select:^id(id person) { 
    return [person name]; 
}] linq_orderByAscending]; 

NB Quité segunda condición, ya que no tiene sentido (ID = 2!).

Actualmente la biblioteca proporciona métodos de extensión (categorías) para clases de colección, pero en el futuro también voy a extender su funcionalidad a NSManagedObjectContext para proporcionar acceso directo a la consulta de datos básicos.

Cuestiones relacionadas