似乎有不同的方法使用linq进行连接。一个更直接,只涉及加入这样的表:
var found = from c in s.categories
join cm in s.categorymaps on c.CategoryId equals cm.ChildCategoryId
select c;
还有另一种使用lambdas的方式,我有一段时间试图弄清楚如何使用这种语法加入。任何人都可以提供详细解释和大量示例的链接吗?或者只是简单地演示使用示例如何使用这种相当混乱的语法?
var x = _session.All<category>().Join<categorymap,category, ....
答案 0 :(得分:136)
通常我更喜欢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
你可能不得不根据你想要返回的内容来调整投影,但这就是它的主旨。
答案 1 :(得分:13)
您可以找到一些示例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 join method syntax'。
答案 2 :(得分:0)
如果您已配置导航属性1-n,我建议您使用:
var query = db.Categories // source
.SelectMany(c=>c.CategoryMaps, // join
(c, cm) => new { Category = c, CategoryMaps = cm }) // project result
.Select(x => x.Category); // select result
对我来说更清晰,使用多个嵌套联接看起来更好。