2010-08-25 86 views
2

如何使用exptension方法創建此表達式,但(!)不使用匿名類型?LINQ查詢表達式和擴展方法

from p in posts 
       join u in context.oxite_Users on p.CreatorUserID equals u.UserID 
       join pa in context.oxite_PostAreaRelationships on p.PostID equals pa.PostID 
       join a in context.oxite_Areas on pa.AreaID equals a.AreaID 
       let c = getCommentsQuery(p.PostID) 
       let t = getTagsQuery(p.PostID) 
       let tb = getTrackbacksQuery(p.PostID) 
       let f = getFilesQuery(p.PostID) 
       where p.State != (byte)EntityState.Removed 
       orderby p.PublishedDate descending 
       select new Post 
       { area = a, comments = c } e.t.c. 
+2

出於好奇 - *爲什麼*你想這樣做,而不是一種類型?匿名類型是LINQ語法解構的內部實現細節......這是因爲它們讓生活變得更簡單。 – 2010-08-25 11:16:37

+0

ADO.NET實體框架和數據提供程序System.Data.SQLite不適用於查詢表達式和匿名類型。他們甚至不使用lambda運算符。=>,所以你必須編寫所有的擴展方法(使用委託)。它變成了很多代碼,但它的工作原理。 :-) 謝謝回覆! – 2010-08-25 16:06:33

回答

2

這裏的關鍵是引入一個封裝連接操作和其他let S的結合狀態的元組。我不能僅僅從這個角度重新描述你的環境,但這是一個有限的例子,應該說清楚(ish);

using System.Linq; 
static class Program 
{ 
    static void Main() 
    { 
     var users = new User[0]; // intentionally 0; only exists to prove compiles 
     var orders = new Order[0]; 

     var query = users.Join(orders, user => user.UserId, order => order.OrderId, (user,order) => new UserOrderTuple(user,order)) 
      .Where(tuple => tuple.State != 42).OrderByDescending(tuple => tuple.Order.OrderId) 
      .Select(tuple => new ResultTuple { Comment = tuple.Comment }); 
    } 
} 

class ResultTuple 
{ 
    public string Comment { get; set; } 
} 
class UserOrderTuple 
{ 
    public UserOrderTuple(User user, Order order) 
    { 
     User = user; 
     Order = order; 
     Comment = "some magic that gets your comment and other let"; 
     State = 124; 
    } 
    public string Comment { get; private set; } 
    public int State { get; private set; } 
    public User User { get; private set; } 
    public Order Order { get; private set; } 
} 
class User 
{ 
    public int UserId { get; set; } 
} 
class Order 
{ 
    public int UserId { get; set; } 
    public int OrderId { get; set; } 
}