Entityframework使用join方法和lambdas加入

时间:2011-02-15 22:09:06

标签: entity-framework join lambda

似乎有不同的方法使用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, ....

3 个答案:

答案 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

对我来说更清晰,使用多个嵌套联接看起来更好。