Mở đầu
LINQ to FQL là dự án mã nguồn mở. Sources, những chương trình và mẫu có thể được tìm thấy tại CodePlex. Thư viện mở rộng Facebook Developer Toolkit.
Giới thiệu
Thư viện này cho phép người phát triển sử dụng LINQ (NET. Language-Integrated Query) với Facebook thay vì dựa trên chuỗi truy vấn FQL. Những lợi ích chính của việc sử dụng thư viện này là:
- Kiểu an toàn: truy vấn được nhập và cú pháp của chúng được xác minh trong quá trình dịch
- Tự động hoàn thành tại chức năng khi soạn câu truy vấn trong Visual Studio
- Đối tượng sử dụng Facebook /vô danh cho kết quả truy vấn
Ví dụ: Mã mẫu sau lấy tên và hình ảnh của tất cả bạn bè của bạn.
var db = new FacebookDataContext();
var friendIDs = from friend in db.friend_info where friend.uid1 ==
db.uid select friend.uid2;
var friendDetails = from user in db.user where friendIDs.Contains(user.uid)
select new { Name = user.name, Picture = user.pic_small };
Bắt đầu
Trong khi LINQ được mở rộng, không phải là LINQ to SQL (trước đây gọi là DLINQ). Thực hiện nội bộ và chỉ hỗ trợ SQL Server. Để có thể hỗ trợ FQL, nó cần thiết để bắt chước các LINQ to SQL, như sau:
- FqlDataContext đại diện cho nguồn dữ liệu hỗ trợ FQL, và bao gồm trường hợp FqlTable.
- FqlTable đại diện cho bảng trong mô hình, và cung cấp mục tiêu cho các truy vấn LINQ.
- FqlDataQuery đại diện cho truy vấn LINQ được thực hiện trên FqlTable .
- FqlProvider quản lý việc chuyển đổi và thực hiện các câu truy vấn.
- FqlQueryBuilder biến đổi biểu thức LINQ to FQL.
- FacebookDataContext xuất phát từ FqlDataContext , và đưa ra các mô hình phát triển bộ công cụ Facebook như Table.
Theo sau truy vấn LINQ to FQL trông như thế này:
Table được truy vấn sử dụng LINQ (trong FqlTable.CreateQuery )
Biểu thức LINQ được phân tích và chuyển thành văn bản FQL hợp lệ (trong FqlQueryBuilder.BuildQuery )
Văn bản FQL được gửi thông qua Facebook API (trong API.linq.query )
Kết quả XML được trả về, và deserialized trở lại bên trong đối tượng thích hợp (trong FqlQueryResultEnumerator.GetEnumerator )
Chuyển LINQ to FQL
Chuyển đổi LINQ to FQL được thực hiện thông qua lớp FqlQueryBuilder. Lớp này có một cây expression , có nghĩa là, một thể hiện của System.Linq.Expressions.Expression , và đệ quy lặp biểu thức phụ. Trong quá trình lặp đi lặp lại này, mỗi biểu thức phụ được xác định và chuyển thành văn bản FQL bởi các dữ liệu expression của nó và trạng thái hiện tại của người buider. Ví dụ:
- Điều kiện truy vấn (SELECT, FROM, WHERE, ORDERBY...) được xác định bởi biểu thức methodCall được biết đến phương thứcLINQ, ví dụ như SELECT điều kiện phải phù hợp với phương thức System.Linq.Queryable.Select.
- Table được xác định bởi MemberExpressions khi loại thành viên thực hiện giao diện IFqlTable.
- Cột được xác định bởi MemberExpressions khi thành viên có các thuộc tính tùy chỉnh thích hợp.
- Truy vấn phụ được xác định bởi MemberExpressions khi loại thành viên thực hiện giao diện IFqlDataQuery.
Tích hợp với LINQ
Một số lớp và giao diện được sử dụng để tích hợp với LINQ:
- IEnumerable , IEnumerable , IEnumerator , IEnumerator<T> được sử dụng để trả lại kết quả vật lý iteratable.
- IQueryable , IQueryable<T> được sử dụng để tạo ra các lớp có điều kiện nhiều hơn truy vấn LINQ được áp dụng trên nó.
- IQueryProvider được sử dụng để ghi lại và thực hiện truy vấn.
- Không gian tên System.Linq.Expressions được sử dụng như mô hình cơ bản của truy vấn LINQ.
Lớp chính phục vụ như là mục tiêu để xử lý các truy vấn LINQ trong thư viện này gồm lớp FqlTable<T> thực hiện cả hai interface IQueryable và IQueryProvider.
public class FqlTable<T> : IQueryable, IQueryable<T>, IQueryProvider
{
//IQueryable
public IQueryProvider Provider
{
get { return this; }
}
//IQueryProvider
public IQueryable<TResult> CreateQuery<TResult>(Expression expression)
{
return new FqlDataQuery<TResult>(this.context, expression, typeof(T));
}
}
Chạy ví dụ
Mẫu này có sẵn trực tuyến, chỉ cần nhấp vào nút Run để chạy các mẫu, hoặc nhấp vào bất kỳ của tập tin mã nguồn để xem hoặc chỉnh sửa chúng.
Để chạy các mẫu tại local, hãy làm theo các bước sau:
- Mở tập tin SampleQuery.sln trong Visual Studio.NET 2008.
- Khi bạn được nhắc nhở để tạo thư mục ảo http://localhost/SimpleQuery cho ứng dụng, nhấp chuột Yes.
Bạn có thể chạy ứng dụng, lưu ý rằng nó sẽ sử dụng ứng dụng Facebook chung được xác định trước sẽ chuyển hướng Facebook đến mẫu local. Để sử dụng ứng dụng của bạn, tiếp tục các bước sau:
- Đến ứng dụng phát triển trong tài khoản Facebook của bạn.
- Click vào "Setup new application".
- Cung cấp cho ứng dụng của bạn tên SimpleQuery .
- Thiết lập URL gọi lại: http://localhost/SimpleQuery/facebookcallback.ashx .
- Trong tab canvas, thiết lập phương thức Render đến IFrame .
- Bấm vào "Save changes".
- Trong trang tiếp theo - sao chép và dán các khóa API, Application Secret và Application ID cho mẫu dự án tập tin web.config.
<appSettings>
<add key="Facebook.Linq.ApplicationID" value="xxxxxxxx" />
<add key="Facebook.Linq.APIKey" value="xxxxxxxxxxxxxxxxxxxxxx" />
<add key="Facebook.Linq.Secret" value="xxxxxxxxxxxxxxxxxxxxxx" />
</appSettings>
Chạy ứng dụng bằng cách bấm vào Run trong Visual Studio.
Sử dụng Mã
Điểm chính sử dụng truy vấn LINQ là lớp FacebookDataContext. Lớp này chứa tất cả các bảng của Facebook, và mỗi bảng là queryTable sử dụng LINQ. Để sử dụng nó - tạo ra một instance mới của FacebookDataContext, và sử dụng LINQ trên bất kỳ thuộc tính bảng trên nó.
var db = new FacebookDataContext();
var myUser = db.user.Where(t => t.uid==db.uid).FirstOrDefault();
Nó cũng có thể xác định chính xác kết nối vào Facebook được sử dụng, sử dụng lớp facebook.API(nằm trong Facebook Developer Toolkit assembly).
var api = new API { ApplicationKey = "MyAppKey",
AuthToken = "MyAuthToken", SessionKey = "MySessionKey", Secret = "MySecret" };
var db = new FacebookDataContext(api);
Ví dụ 1: Cú pháp
Có hai loại cú pháp để sử dụng LINQ, một được gọi là Cú pháp truy vấn LINQ và khác là Cú pháp phương thức LINQ. Cú pháp truy vấn LINQ thực hiện mới và nguồn gốc từ ngôn ngữ C# 3.0. Nó không phải là mở rộng và do đó nó có một số hạn chế. Tin tốt là cả hai loại cú pháp có thể được trộn lẫn trong cùng truy vấn và nhận được kết quả tương tự.
var db = new FacebookDataContext();
//LINQ Query Syntax
var friendsIDs = from friend in db.friend_info where friend.uid1 ==
db.uid select friend.uid2;
//LINQ Method Syntax (the same query)
var friendsIDs2 = db.friend_info.Where(t => t.uid1 == db.uid).Select(t => t.uid2);
Ví dụ 2: Truy vấn lồng nhau
FQL hỗ trợ việc sử dụng chỉ một bảng trong mỗi truy vấn, có nghĩa là bảng tham gia không được hỗ trợ. Về mặt tích cực, FQL cho phép sử dụng nhiều hơn một bảng sử dụng truy vấn lồng nhau đó là LINQ to FQL. Trong tương lai, thư viện này phải bù đắp nhược điểm này bằng cách chuyển đổi biểu thức LINQ sử dụng các điều kiện tham gia để lồng nhau hoặc nhiều truy vấn FQL.
var db = new FacebookDataContext();
var friendIDs = from friend in db.friend_info where friend.uid1 ==
db.uid select friend.uid2;
var friendDetails = from user in db.user where friendIDs.Contains(user.uid) select user;
//Or in a single line
var friendDetails2 = from user in db.user where
(from friend in db.friend_info where friend.uid1 ==
db.uid select friend.uid2).Contains(user.uid) select user;
Ví dụ 3: Lấy thuộc tính riêng
Lấy thuộc tính riêng sử dụng LINQ được thực hiện bằng cách sử dụng điều kiện Select, đó là phần quan trọng trong việc tối ưu hóa truy vấn vì nó giảm thiểu dữ liệu trả về từ Facebook. Điều kiện Select thường đòi hỏi bạn phải có đối tượng có thể lựa chọn dữ liệu, nhưng không phải lo lắng, kiểu vô danh làm việc rất đơn giản. Kiểu vô danh cho phép bạn ngầm định nghĩa lớp mới với tập hợp các thuộc tính chỉ đọc. Trong ví dụ này, kiểu vô danh sẽ được tạo ra với hai thuộc tính - Tên và hình ảnh, cả hai sẽ có kiểu chuỗi .
var db = new FacebookDataContext();
var friendIDs = from friend in db.friend_info where friend.uid1 ==
db.uid select friend.uid2;
var friendDetails = from user in db.user where friendIDs.Contains(user.uid)
select new { Name = user.name, Picture = user.pic_small };
Ví dụ 4: Paging và Sorting
Sắp xếp được thực hiện bằng cách sử dụng điều khoản orderby (sử dụng cú pháp truy vấn), hoặc phương thức OrderBy (sử dụng cú pháp phương thức). Phân trang được thực hiện bằng phương thức Skip và Take , lưu ý rằng phân trang không có Cú pháp truy vấn LINQ thay thế. Phân trang cũng là phần quan trọng trong việc tối ưu hóa truy vấn vì nó giới hạn số hàng sẽ được trả lại từ Facebook.
var db = new FacebookDataContext();
var friendIDs = from friend in db.friend_info where friend.uid1 ==
db.uid select friend.uid2;
var friendDetails = (from user in db.user where friendIDs.Contains(user.uid)
orderby user.name select new { Name = user.name,
Picture = user.pic_small }).Skip(4).Take(5);
Không gian tên facebook.Web
Không gian tên facebook.Web chứa một số lớp hữu ích được thiết kế để giúp tích hợp Facebook. Tuy nhiên, chúng không quan trọng đối với LINQ to FQL. Ví dụ, khi bạn sử dụng FacebookDataContext hàm dựng rỗng, đối tượng facebook.API sẽ được sử dụng. Bối cảnh này có thể truy cập thông qua thuộc tính FacebookContext.Current hoặc (HttpContext) phương thức FacebookContext.Get, và chứa tất cả các thông tin theo ngữ cảnh có liên quan Facebook như đang đăng nhập người dùng và các thông tin ứng dụng. Các ứng dụng mặc định sẽ được sử dụng bởi lớp FacebookDataContext được định nghĩa trong tập tin web.config.
<appSettings>
<add key="Facebook.Linq.ApplicationID" value="xxxxxxxx" />
<add key="Facebook.Linq.APIKey" value="xxxxxxxxxxxxxxxxxxxxxx" />
<add key="Facebook.Linq.Secret" value="xxxxxxxxxxxxxxxxxxxxxx" />
</appSettings>
Đối với hỗ trợ đầy đủ của FacebookContext, bạn cũng nên đăng ký xử lý FacebookCallback trong tập tin web.config. Xử lý FacebookCallback tự động chuyển hướng đến và gọi lại từ Facebook, nó cũng tự động hóa quá trình đăng nhập.
<system.web>
<httpHandlers>
<add verb="*" path="FacebookCallback.ashx" type="Facebook.Web.FacebookCallback,
Facebook.Linq, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null" validate="false"/>
</httpHandlers>
</system.web>
Sử dụng kỹ thuật này, nó dễ dàng để xác minh rằng người dùng đang đăng nhập, nếu chưa đăng nhập sẽ được chuyển đến trang đăng nhập Facebook.
if (FacebookContext.Current.TryAuthenticating(true))
{
var db = new FacebookDataContext(); //in here the FacebookDataContext
// object will use the currently authenticated user connection info.
}
Tùy chỉnh Mô hình Facebook
Trong khi FqlDataContext thực hiện chung được thiết kế để làm việc với bất kỳ mô hình, các lớp FacebookDataContext xuất phát từ nó, và thực hiện mô hình Facebook cụ thể. Điều này cung cấp sự linh hoạt để tạo ra mô hình Facebook và map của riêng bạn để FQL sử dụng thuộc tính tùy chỉnh. Thư viện này thực sự hỗ trợ các thuộc tính tùy chỉnh tương tự như LINQ gốc thực hiện SQL, đây là những TableAttribute và ColumnAttribute. Ví dụ:
[Table(Name="album")]
public class Album
{
[Column(Name="aid", IsPrimaryKey=true)]
public long ID { get; set; }
[Column(Name="cover_pid")]
public long CoverPictureID {get;set;}
}
public class FacebookFriendlyDataContext : FqlDataContext
{
public FqlTable<Album> Albums
{
get
{
return GetTable<Album>();
}
}
}
Hướng dẫn thực hiện
LINQ to FQL là công cụ mạnh mẽ và cần được sử dụng cẩn thận. Điều quan trọng là phải nhớ rằng ứng dụng của bạn không liên lạc với cơ sở dữ liệu local, nhưng dịch vụ từ xa. Bất kỳ dữ liệu mà ứng dụng nhận được qua đường này đi qua internet như là một thông điệp XML. Vì vậy, nó rất quan trọng để thử và chỉ nhận được các dữ liệu mà ứng dụng của bạn thực sự cần. Những cách phổ biến nhất để làm điều đó là:
- Chỉ lựa chọn các cột mà bạn cần để xử lý hoặc hiển thị.
- Lọc truy vấn của bạn bằng cách sử dụng LINQ to FQL và không có trong bộ nhớ.
- Sử dụng phân trang - nếu bạn không lập kế hoạch để hiển thị hoặc xử lý toàn bộ kết quả truy vấn, không lấy tất cả.