присоединение entityframe с использованием метода join и лямбда-выражений

<p>кажется, есть разные способы сделать соединения, используя linq. один из них более прост и включает в себя просто объединение таблиц следующим образом:</p><pre><code>var found = from c in s.categories join cm in s.categorymaps on c.categoryid equals cm.childcategoryid select c; </code></pre><p>есть еще один способ использовать лямбды, и у меня есть куча времени, пытаясь выяснить, как присоединиться, используя этот синтаксис. может ли кто-нибудь предоставить ссылки на подробные объяснения и множество примеров? или просто продемонстрируйте на примерах, как использовать этот довольно запутанный синтаксис?</p><pre><code>var x = \_session.all<category>().join<categorymap,category, .... </code></pre>

<p>обычно я предпочитаю лямбда-синтаксис с linq, но <code>join</code> - один из примеров, где я предпочитаю синтаксис запроса - исключительно для удобства чтения.</p><p>тем не менее, вот эквивалент вашего вышеупомянутого запроса (я думаю, не проверенный):</p><pre><code>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 </code></pre><p>возможно, вам придется возиться с проекцией в зависимости от того, что вы хотите вернуть, но в этом суть.</p>

<p>вы можете найти несколько примеров <a href="http://msdn.microsoft.com/en-us/library/bb669071.aspx">здесь</a> :</p><blockquote> <pre><code>// 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); } </code></pre></blockquote><p>или просто google для "синтаксиса метода соединения linq".</p>