【问题标题】:Entityframework Join using join method and lambdas使用连接方法和 lambdas 的实体框架连接
【发布时间】:2011-06-27 23:06:09
【问题描述】:

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

【问题讨论】:

    标签: entity-framework join lambda


    【解决方案1】:

    通常我更喜欢 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
    

    您可能需要根据要返回的内容来调整投影,但这就是它的要点。

    【讨论】:

    • 迄今为止我发现的最好的解释,我能够解决我的加入问题,谢谢
    • MS 中的谁坐在那里并认为这种语法是理智的?我想见他,问他一两个问题
    • 这样的代码的缺点之一是您从 Join 获得的匿名类,这使得结果难以传递,例如传递给视图、控制器或事件框架。我喜欢编写显式的中间类,其中包含我在 Join 中关心的属性的完全组合。结果是我得到了强类型和更好的 SQL 性能,因为返回的列列表比完整的行更受限制。
    【解决方案2】:

    你可以找到几个例子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'。

    【讨论】:

    • 感谢大家的帮助。我发现这个非常有用的链接真正解释了相当复杂的 join() 方法,所以我想我会分享给其他人学习
    【解决方案3】:

    如果您配置了导航属性 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
    

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

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2013-05-15
      • 2012-12-11
      • 1970-01-01
      • 2020-11-18
      • 2012-07-09
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多