Подтвердить что ты не робот

Entityframework Присоединиться с помощью метода join и lambdas

Кажется, существуют разные способы соединения с использованием 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, ....
4b9b3361

Ответ 1

Обычно я предпочитаю синтаксис лямбда с LINQ, но 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

Возможно, вам придется поиграть с проекцией в зависимости от того, что вы хотите вернуть, но в том, что ее суть.

Ответ 2

Вы можете найти несколько примеров здесь:

// 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);
}

Или просто Google для синтаксиса метода linq join.