2009-12-09 84 views
2

我是新來的LINQ,所以如果這是一個簡單的答案,我很抱歉。我試圖做一個SQL連接,並根據下面的代碼我已經看到了SO和其他地方:LINQ to SQL加入

var query = from e in db.Events 
    join ec in db.EventCategories on e.ID equals ec.EventID 
    join c in db.Categories on ec.CategoryCode equals c.CategoryCode 
    join ep in db.EventParticipants on e.ID equals ep.EventID 
    join p in db.Participants on ep.ParticipantCode equals p.ParticipantCode 
    select new { e, ec, c, ep, p }; 

此執行罰款,當我運行調試,我可以擴大對象,並查看該查詢成功運行。但是,當我嘗試執行query.ToList()時,我無法將其轉換成任何可用的東西,因爲它說query.ToList()返回的列表是System.Collections.Generic.List。

方法2: 根據我自己的想法我試圖創建以下結構:

public struct CalendarItem 
    { 
     public Event e; 
     public EventCategory ec; 
     public Category c; 
     public EventParticipant ep; 
     public Participant p; 

     public CalendarItem(Event E, EventCategory EC, Category C, EventParticipant EP, Participant P) 
     { 
      e = E; 
      ec = EC; 
      c = C; 
      ep = EP; 
      p = P; 
     } 
    } 

然後修改LINQ命令如下:

var query = from e in db.Events 
    join ec in db.EventCategories on e.ID equals ec.EventID 
    join c in db.Categories on ec.CategoryCode equals c.CategoryCode 
    join ep in db.EventParticipants on e.ID equals ep.EventID 
    join p in db.Participants on ep.ParticipantCode equals p.ParticipantCode 
    select new CalendarItem(e, ec, c, ep, p); 

在Visual Studio這個檢查它允許我編譯和一切看起來不錯(即我可以遍歷CalendarItems的列表),但我得到了query.ToList()的運行時錯誤:成員'e'沒有支持的SQL轉換。

回答

4

我會想辦法讓我CalandarItem自動屬性的類:

public class CalendarItem 
{ 
     public Event E{get;set;} 
     public EventCategory EC{get;set;} 
     public Category C{get;set;} 
     public EventParticipant EP{get;set;} 
     public Participant P{get;set;} 
} 

和使用在選擇一個對象初始化:

var query = from e in db.Events 
    join ec in db.EventCategories on e.ID equals ec.EventID 
    join c in db.Categories on ec.CategoryCode equals c.CategoryCode 
    join ep in db.EventParticipants on e.ID equals ep.EventID 
    join p in db.Participants on ep.ParticipantCode equals p.ParticipantCode 
    select new CalendarItem{E=e, EC=ec, C=c, EP=ep, P=p}; 

我知道這工作,因爲我剛好寫的代碼非常相似位約2分鐘前!

+0

謝謝!這工作完美 – Kyle 2009-12-09 15:21:04

1

一種選擇是調用AsEnumerable匿名投射後:

var query = (from e in db.Events 
    join ec in db.EventCategories on e.ID equals ec.EventID 
    join c in db.Categories on ec.CategoryCode equals c.CategoryCode 
    join ep in db.EventParticipants on e.ID equals ep.EventID 
    join p in db.Participants on ep.ParticipantCode equals p.ParticipantCode 
    select new { e, ec, c, ep, p }) 
    .AsEnumerable() // Do the rest in process 
    .Select(x => new CalendarItem(x.e, x.ec, x.c, x.ep, x.p) 
    .ToList(); 

順便說一句,如果你是採取這種方法,我強烈建議不要使用一個可變的結構或公共領域。兩者都是潛在的麻煩領域。您可以輕鬆地將其轉變成具有屬性的不可變類,在任何情況下給他們使用的名字:)

public class CalendarItem 
{ 
    public Event Event { get; private set; } 
    public EventCategory EventCategory { get; private set; } 
    public Category Category { get; private set; } 
    public EventParticipant EventParticipant { get; private set; } 
    public Participant Participant { get; private set; } 

    public CalendarItem(Event event, 
         EventCategory eventCategory, 
         Category category, 
         EventParticipant eventParticipant, 
         Participant participant) 
    { 
     Event = event; 
     EventCategory = eventCategory; 
     Category = category; 
     EventParticipant = eventParticipant; 
     Participant = participant; 
    } 
} 
+0

我認爲這樣可以很好地工作,但是我在做LINQ代碼的其餘部分(即有條件的部分)時,語法似乎並不奏效。 – Kyle 2009-12-09 15:21:49