Entityframework使用join方法和lambdas加入

Mas*_*son 53 lambda entity-framework join

似乎有不同的方法使用linq进行连接.一个更直接,只涉及加入这样的表:

var found = from c in s.categories
            join cm in s.categorymaps on c.CategoryId equals cm.ChildCategoryId
            select c;
Run Code Online (Sandbox Code Playgroud)

还有另一种使用lambdas的方法,我有一段时间试图弄清楚如何使用这种语法加入.任何人都可以提供详细解释和大量示例的链接吗?或者只是简单地演示使用示例如何使用这种相当混乱的语法?

var x = _session.All<category>().Join<categorymap,category, ....
Run Code Online (Sandbox Code Playgroud)

RPM*_*984 141

通常我更喜欢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
Run Code Online (Sandbox Code Playgroud)

您可能不得不根据要返回的内容来调整投影,但这就是它的主旨.

  • 谁在MS坐在那里,并认为这种语法是理智的?我想和他见面并给他一两个问题 (2认同)

Jak*_*cki 13

你可以在这里找到几个例子:

// 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);
}
Run Code Online (Sandbox Code Playgroud)

或者只是谷歌搜索'linq join method syntax'.

  • @Mason - 如果你发现它有用,请提出我的答案 (2认同)