54 votes

Entityframework Jointure à l'aide de méthode de participation et les lambdas

Il semble qu'il y a différentes façons de faire des jointures à l'aide de linq. L'un est plus simple et consiste juste à la jointure de tables comme ceci:

var found = from c in s.categories
            join cm in s.categorymaps on c.CategoryId equals cm.ChildCategoryId
            select c;

Il y a un autre chemin à l'aide de lambda et je vais avoir un diable de temps à essayer de comprendre comment le rejoindre à l'aide de cette syntaxe. Quelqu'un peut fournir des liens vers des explications détaillées et de nombreux exemples? Ou tout simplement de démontrer à l'aide d'exemples comment utiliser ce plutôt déroutant de la syntaxe?

var x = _session.All<category>().Join<categorymap,category, ....

148voto

RPM1984 Points 39648

En général je préfère le lambda de la syntaxe LINQ, mais Join est un exemple où je préfère la syntaxe de la requête purement pour des raisons de lisibilité.

Néanmoins, ici, c'est l'équivalent de votre requête ci-dessus (je pense, non testé):

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

Vous pourriez avoir à jouer avec la projection en fonction de ce que vous voulez revenir, mais c'est le jist de il.

13voto

Jakub Konecki Points 28852

Vous pouvez trouver quelques exemples ici:

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

Ou tout simplement google pour "linq rejoindre la syntaxe de méthode'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X