2011-02-15 32 views
47

似乎有不同的方式使用linq進行連接。一個更簡單,涉及像這樣剛剛加盟表:實體框架使用連接方法和lambda表達式加入

var found = from c in s.categories 
      join cm in s.categorymaps on c.CategoryId equals cm.ChildCategoryId 
      select c; 

有使用lambda表達式的另一種方式,我有一個時間試圖找出如何使用此語法加入赫克。任何人都可以提供詳細解釋和大量例子的鏈接嗎?或者只是簡單地演示如何使用這個相當混亂的語法示例?

var x = _session.All<category>().Join<categorymap,category, .... 

回答

11

你可以找到一些例子here

// Fill the DataSet. 
DataSet ds = new DataSet(); 
ds.Locale = CultureInfo.InvariantCulture; 
FillDataSet(ds); 

DataTable contacts = ds.Tables["Contact"]; 
DataTable orders = ds.Tables["SalesOrderHeader"]; 

var query = 
    contacts.AsEnumerable().Join(orders.AsEnumerable(), 
    order => order.Field<Int32>("ContactID"), 
    contact => contact.Field<Int32>("ContactID"), 
    (contact, order) => new 
    { 
     ContactID = contact.Field<Int32>("ContactID"), 
     SalesOrderID = order.Field<Int32>("SalesOrderID"), 
     FirstName = contact.Field<string>("FirstName"), 
     Lastname = contact.Field<string>("Lastname"), 
     TotalDue = order.Field<decimal>("TotalDue") 
    }); 


foreach (var contact_order in query) 
{ 
    Console.WriteLine("ContactID: {0} " 
        + "SalesOrderID: {1} " 
        + "FirstName: {2} " 
        + "Lastname: {3} " 
        + "TotalDue: {4}", 
     contact_order.ContactID, 
     contact_order.SalesOrderID, 
     contact_order.FirstName, 
     contact_order.Lastname, 
     contact_order.TotalDue); 
} 

或者只是谷歌 'LINQ加入方法的語法'。

+0

謝謝大家的幫助。我發現這非常有用的鏈接,這真的解釋了相當複雜的join()方法,所以想我會分享給其他人學習 – Mason 2011-02-18 21:56:23

+2

@Mason - 如果你覺得它有用,請upvote我的回答 – 2011-02-18 22:22:28

124

通常我更喜歡LINQ的lambda語法,但Join是一個我喜歡查詢語法的例子 - 純粹爲了可讀性。

儘管如此,這裏是你上面的查詢相當於(我認爲,未經測試):

var query = db.Categories   // source 
    .Join(db.CategoryMaps,   // target 
     c => c.CategoryId,   // FK 
     cm => cm.ChildCategoryId, // PK 
     (c, cm) => new { Category = c, CategoryMaps = cm }) // project result 
    .Select(x => x.Category); // select result 

你可能有這取決於你想回到什麼投影撥弄,但這是它的JIST 。

相關問題