2009-01-09 6 views
20

Tôi tự hỏi nếu nó là có thể (và làm thế nào) để cung cấp một lớp trong Objective-C với một cái gì đó như:Có điều gì đó tương tự với LINQ trong Mục tiêu-C không?

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

Đó có thể là rất tiện dụng cho một dự án tôi đang làm.

Tôi thích cách mã hóa này có trong Django & SubSonic.

+2

Tôi rất thích một LINQ tương đương trong mục tiêu-C. Ai đó nên viết một cái! –

+2

@JonathanSterling - Tôi có! https: // github.com/ColinEberhardt/LinqToObjectiveC – ColinE

+1

@JonathanSterling, vui lòng kiểm tra LINQ4Obj-C có sẵn trên GitHub: https://github.com/michalkonturek/LINQ4Obj-C. Bạn có thể tìm tài liệu tại đây: http://cocoadocs.org/docsets/LINQ4Obj-C/1.0.0/ –

Trả lời

6

Câu trả lời ngắn gọn là không có tương đương với LINQ cho mục tiêu-C nhưng bạn có thể giả mạo nó bằng cách kết hợp các cuộc gọi SQLite, NSPredicate và CoreData trong lớp bao bọc theo ý thích của bạn. Có thể bạn sẽ quan tâm đến số core data guide, số predicate guidethis example code.

Từ hướng dẫn ngữ trên:

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

Có một hành động so sánh các cách Windows và Cocoa để thực hiện việc này. Cocoa sử dụng chính Paths Và NSPredicate ....

Cocoa is my Girlfriend

3

Tôi nghĩ cụ thể với ví dụ của bạn này sẽ là tương đương trong 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"]; 

Đó là nhiều hơn một chút dài dòng hơn ví dụ LINQ và một số dòng của tôi có thể đã được kết hợp nhưng để mắt của tôi này dễ dàng hơn để phân tích cú pháp.

0

Kiểm tra kho sau: https://github.com/ziminji/objective-c-sql-query-builder

Những lớp học cung cấp một tập các phương pháp thuận tiện có thể được sử dụng để xây dựng các truy vấn SQL tốt được hình thành một cách nhanh chóng cho Sqlite . Chúng khá đơn giản để sử dụng và tương đối thẳng vì chúng tuân theo cú pháp SQL cơ bản.

15

Tôi đã tạo API kiểu Linq của riêng mình cho Mục tiêu C, là available on github. ví dụ cụ thể của bạn sẽ trông như thế này:

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

Theo giấy phép nào của thư viện của bạn? Tôi có thể sử dụng nó trong phần mềm thương mại không? –

+1

@Zoidberg - điểm tốt, tôi đã không chỉ định giấy phép. Tôi vừa cập nhật dự án để bao gồm một giấy phép MIT, vì vậy điều này sẽ chỉ tốt cho sử dụng thương mại. – ColinE

+0

Điều này thực sự tốt, nó rất giống với LINQ ngoại trừ việc có vẻ như bạn đang sử dụng các phương thức nặc danh thay vì vị ngữ? –

3

Dự án của tôi, LINQ4Obj-C, cảng LINQ khai thác truy vấn tiêu chuẩn để Objective-C.

Bạn có thể tìm thấy nó trên githubdocs here của nó. Thư viện này cũng có sẵn qua CococaPods.

Mã nguồn của dự án này có sẵn theo giấy phép MIT tiêu chuẩn.

dụ của bạn sẽ trông này:

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

NB tôi loại bỏ điều kiện thứ hai vì nó là vô nghĩa (ID = 2!).

Hiện tại thư viện cung cấp các phương pháp mở rộng (danh mục) cho các lớp thu, nhưng trong tương lai tôi cũng sẽ mở rộng chức năng của nó thành NSManagedObjectContext để cung cấp truy cập trực tiếp vào Dữ liệu chính.