2011-02-15 37 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 。

相关问题