Plusieurs Jointures dans le Cadre de l'Entité de la requête

Longtemps lurker, affiche la première fois. J'ai trouvé quelques bonnes réponses ici, dans le passé, alors à la figure, je voudrais venir ici et voir si je peux obtenir un peu d'aide!

Je suis assez nouveau à Linq et je suis en utilisant Entity Framework pour mon objet. J'ai une .fichier edmx dans mon projet.

Tout d'abord j'ai importé l'utilisation du Système.Linq.Dynamique de la classe à partir de l'échantillon des pages qui est venu avec VS 2010, de sorte que je peux ajouter ceci dans ma page:

en utilisant le Système.Linq.Dynamique;

Le problème est, je ne pense pas que ma jointure fonctionne bien.

C'est mon code actuel:

private void FetchData()
{
    using (var Context = new ProjectEntities())
    {
        var Query =
            Context.Users
            .Join(Context.UserStats,            //Table to Join
                u => u.msExchMailboxGuid,       //Column to Join From
                us => us.MailboxGuid,           //Column to Join To
                (u, us) => new                  //Alias names from Tables
                {
                    u,
                    us
                })
            .Join(Context.TechContacts,         //Table to Join
                u => u.u.UserPrincipalName,     //Column to Join From
                tc => tc.UPN,                   //Column to Join To
                (u, tc) => new                  //Alias names from Tables
                {
                    u = u,
                    tc = tc
                })
               .Where(u => true)
               .OrderBy("u.u.CompanyName")
               .Select("New(u.u.CompanyName,tc.UPN,u.us.TotalItemSize)");

        //Add Extra Filters
        if (!(string.IsNullOrWhiteSpace(SearchCompanyNameTextBox.Text)))
        {

            Query = Query.Where("u.CompanyName.Contains(@0)", SearchCompanyNameTextBox.Text);
        }

        //Set the Record Count
        GlobalVars.TotalRecords = Query.Count();

        //Add Paging
        Query = Query
            .Skip(GlobalVars.Skip)
            .Take(GlobalVars.Take);

        //GridView Datasource Binding
        GridViewMailboxes.DataSource = Query;
        GridViewMailboxes.DataBind();
    }
}

Comment puis-je écrire de sorte qu'il fonctionne comme ce serait normal SQL?

SELECT u.Column1,
u.Column2,
us.Column1,
tc.Column1
FROM Users AS u
INNER JOIN UserStats AS us
ON u.msExchMailboxGuid = us.MailboxGuid
INNER JOIN TechContacts AS tc
ON u.UserPrincipalName = tc.UPN

J'ai besoin de garder la dynamique .Les clauses where et .Sélectionnez les noms de champ, le problème comme vous pouvez le voir maintenant, c'est que j'ai besoin de faire u.u.Nom de la société pour obtenir le retour à l'u.Nom de la société, puisqu'elle est dans ma rejoint deux fois.

J'ai googlé pour ce pour un certain temps maintenant, mais pas de dés encore.

Toute aide appréciée!

EDIT - c'est ma requête actuelle. Cela fonctionne, mais il est un peu un cauchemar pour les yeux.

Garder avec moi. Je voulais tout mettre ici, si je peux, même si c'est un peu beaucoup.

Dynamique de la colonne de sélection est un must pour moi. Sinon, je pourrais aussi bien rester avec ma table à cartes et stockées procs. Être en mesure de réduire ma requête de retour moins de données est l'un de mes objectifs avec ce. Si quelqu'un peut suggérer des améliorations, je suis toutes les oreilles?

Je ne pouvais pas trouver un moyen d'arrêter d'avoir à sélectionner mes jointures dans les points, en SQL quand je rejoins je n'ai qu'à renvoyer les colonnes que je veux par mon instruction SELECT.

private void FetchData()
{
using (var Context = new ProjectEntities())
{
string Fields = GetDynamicFields();
var Query =
Context.Users
.Join(Context.UserStats,            //Table to Join
u => u.msExchMailboxGuid,       //Column to Join From
us => us.MailboxGuid,           //Column to Join To
(u, us) => new                  //Declare Columns for the next Join
{
ObjectGuid = u.objectGuid,
msExchMailboxGuid = u.msExchMailboxGuid,
CompanyName = u.CompanyName,
ResellerOU = u.ResellerOU,
DisplayName = u.DisplayName,
MBXServer = u.MBXServer,
MBXSG = u.MBXSG,
MBXDB = u.MBXDB,
MBXWarningLimit = u.MBXWarningLimit,
MBXSendLimit = u.MBXSendLimit,
MBXSendReceiveLimit = u.MBXSendReceiveLimit,
extensionAttribute10 = u.extensionAttribute10,
legacyExchangeDN = u.legacyExchangeDN,
UserPrincipalName = u.UserPrincipalName,
Mail = u.Mail,
lastLogonTimeStamp = u.lastLogonTimestamp,
createTimeStamp = u.createTimeStamp,
modifyTimeStamp = u.modifyTimeStamp,
altRecipient = u.altRecipient,
altRecipientBL = u.altRecipientBL,
DeletedDate = u.DeletedDate,
MailboxGuid = us.MailboxGuid,
Date = us.Date,
AssociatedItemCount = us.AssociatedItemCount,
DeletedItemCount = us.DeletedItemCount,
ItemCount = us.ItemCount,
LastLoggedOnUserAccount = us.LastLoggedOnUserAccount,
LastLogonTime = us.LastLogonTime,
StorageLimitStatus = us.StorageLimitStatus,
TotalDeletedItemSize = us.TotalDeletedItemSize,
TotalItemSize = us.TotalItemSize,
MailboxDatabase = us.MailboxDatabase
})
.Join(Context.TechContacts,         //Table to Join
u => u.UserPrincipalName,       //Column to Join From
tc => tc.UPN,                   //Column to Join To
(u, tc) => new                  //Declare Final Column Names
{
ObjectGuid = u.ObjectGuid,
msExchMailboxGuid = u.msExchMailboxGuid,
CompanyName = u.CompanyName,
ResellerOU = u.ResellerOU,
DisplayName = u.DisplayName,
MBXServer = u.MBXServer,
MBXSG = u.MBXSG,
MBXDB = u.MBXDB,
MBXWarningLimit = u.MBXWarningLimit,
MBXSendLimit = u.MBXSendLimit,
MBXSendReceiveLimit = u.MBXSendReceiveLimit,
extensionAttribute10 = u.extensionAttribute10,
legacyExchangeDN = u.legacyExchangeDN,
UserPrincipalName = u.UserPrincipalName,
Mail = u.Mail,
lastLogonTimeStamp = u.lastLogonTimeStamp,
createTimeStamp = u.createTimeStamp,
modifyTimeStamp = u.modifyTimeStamp,
altRecipient = u.altRecipient,
altRecipientBL = u.altRecipientBL,
DeletedDate = u.DeletedDate,
MailboxGuid = u.MailboxGuid,
Date = u.Date,
AssociatedItemCount = u.AssociatedItemCount,
DeletedItemCount = u.DeletedItemCount,
ItemCount = u.ItemCount,
LastLoggedOnUserAccount = u.LastLoggedOnUserAccount,
LastLogonTime = u.LastLogonTime,
StorageLimitStatus = u.StorageLimitStatus,
TotalDeletedItemSize = u.TotalDeletedItemSize,
TotalItemSize = u.TotalItemSize,
MailboxDatabase = u.MailboxDatabase,
//New Columns from this join
UPN = tc.UPN,
Customer_TechContact = tc.Customer_TechContact,
Customer_TechContactEmail = tc.Customer_TechContactEmail,
Reseller_TechContact = tc.Reseller_TechContact,
Reseller_TechContactEmail = tc.Reseller_TechContact,
Reseller_Name = tc.Reseller_Name
})
.Where(u => true)
.OrderBy(GlobalVars.SortColumn + " " + GlobalVars.SortDirection)
.Select("New(" + Fields + ")");
//Add Extra Filters
if (!(string.IsNullOrWhiteSpace(SearchCompanyNameTextBox.Text)))
{
Query = Query.Where("CompanyName.StartsWith(@0)", SearchCompanyNameTextBox.Text);
}
//Set the Record Count
GlobalVars.TotalRecords = Query.Count();
//Add Paging
Query = Query
.Skip(GlobalVars.Skip)
.Take(GlobalVars.Take);
//GridView Datasource Binding
GridViewMailboxes.DataSource = Query;
GridViewMailboxes.DataBind();
}
}

C'est ce que SQL s'exécute en arrière-plan:

SELECT TOP (20) 
[Project1].[C1] AS [C1], 
[Project1].[objectGuid] AS [objectGuid], 
[Project1].[msExchMailboxGuid] AS [msExchMailboxGuid], 
[Project1].[CompanyName] AS [CompanyName], 
[Project1].[ResellerOU] AS [ResellerOU], 
[Project1].[DisplayName] AS [DisplayName], 
[Project1].[MBXServer] AS [MBXServer], 
[Project1].[MBXSG] AS [MBXSG], 
[Project1].[MBXDB] AS [MBXDB], 
[Project1].[MBXWarningLimit] AS [MBXWarningLimit], 
[Project1].[MBXSendLimit] AS [MBXSendLimit], 
[Project1].[MBXSendReceiveLimit] AS [MBXSendReceiveLimit], 
[Project1].[extensionAttribute10] AS [extensionAttribute10], 
[Project1].[legacyExchangeDN] AS [legacyExchangeDN], 
[Project1].[UserPrincipalName] AS [UserPrincipalName], 
[Project1].[Mail] AS [Mail], 
[Project1].[lastLogonTimestamp] AS [lastLogonTimestamp], 
[Project1].[createTimeStamp] AS [createTimeStamp], 
[Project1].[modifyTimeStamp] AS [modifyTimeStamp], 
[Project1].[altRecipient] AS [altRecipient], 
[Project1].[altRecipientBL] AS [altRecipientBL], 
[Project1].[DeletedDate] AS [DeletedDate]
FROM ( SELECT [Project1].[objectGuid] AS [objectGuid],
[Project1].[msExchMailboxGuid] AS [msExchMailboxGuid],
[Project1].[CompanyName] AS [CompanyName],
[Project1].[ResellerOU] AS [ResellerOU],
[Project1].[DisplayName] AS [DisplayName],
[Project1].[MBXServer] AS [MBXServer],
[Project1].[MBXSG] AS [MBXSG],
[Project1].[MBXDB] AS [MBXDB],
[Project1].[MBXWarningLimit] AS [MBXWarningLimit],
[Project1].[MBXSendLimit] AS [MBXSendLimit],
[Project1].[MBXSendReceiveLimit] AS [MBXSendReceiveLimit],
[Project1].[extensionAttribute10] AS [extensionAttribute10],
[Project1].[legacyExchangeDN] AS [legacyExchangeDN],
[Project1].[UserPrincipalName] AS [UserPrincipalName],
[Project1].[Mail] AS [Mail],
[Project1].[lastLogonTimestamp] AS [lastLogonTimestamp],
[Project1].[createTimeStamp] AS [createTimeStamp],
[Project1].[modifyTimeStamp] AS [modifyTimeStamp],
[Project1].[altRecipient] AS [altRecipient],
[Project1].[altRecipientBL] AS [altRecipientBL],
[Project1].[DeletedDate] AS [DeletedDate],
[Project1].[C1] AS [C1],
row_number() OVER (ORDER BY [Project1].[CompanyName] ASC) AS [row_number]
FROM ( SELECT 
[Extent1].[objectGuid] AS [objectGuid], 
[Extent1].[msExchMailboxGuid] AS [msExchMailboxGuid], 
[Extent1].[CompanyName] AS [CompanyName], 
[Extent1].[ResellerOU] AS [ResellerOU], 
[Extent1].[DisplayName] AS [DisplayName], 
[Extent1].[MBXServer] AS [MBXServer], 
[Extent1].[MBXSG] AS [MBXSG], 
[Extent1].[MBXDB] AS [MBXDB], 
[Extent1].[MBXWarningLimit] AS [MBXWarningLimit], 
[Extent1].[MBXSendLimit] AS [MBXSendLimit], 
[Extent1].[MBXSendReceiveLimit] AS [MBXSendReceiveLimit], 
[Extent1].[extensionAttribute10] AS [extensionAttribute10], 
[Extent1].[legacyExchangeDN] AS [legacyExchangeDN], 
[Extent1].[UserPrincipalName] AS [UserPrincipalName], 
[Extent1].[Mail] AS [Mail], 
[Extent1].[lastLogonTimestamp] AS [lastLogonTimestamp], 
[Extent1].[createTimeStamp] AS [createTimeStamp], 
[Extent1].[modifyTimeStamp] AS [modifyTimeStamp], 
[Extent1].[altRecipient] AS [altRecipient], 
[Extent1].[altRecipientBL] AS [altRecipientBL], 
[Extent1].[DeletedDate] AS [DeletedDate], 
1 AS [C1]
FROM   [dbo].[Users] AS [Extent1]
INNER JOIN [dbo].[UserStats] AS [Extent2] ON [Extent1].[msExchMailboxGuid] = [Extent2].[MailboxGuid]
INNER JOIN [dbo].[TechContacts] AS [Extent3] ON [Extent1].[UserPrincipalName] = [Extent3].[UPN]
)  AS [Project1]
)  AS [Project1]
WHERE [Project1].[row_number] > 120
ORDER BY [Project1].[CompanyName] ASC
  • Que voulez-vous dire quand vous dites que je ne pense pas que ma jointure fonctionne bien? Est-il retourner les enregistrements corrects? Est-il lent? Avez-vous vu le code sql généré?
  • Normalement quand je rejoins comme ça, je peux utiliser le nom de l'alias de la table pour retourner les dossiers que je veux. f.ex si je l'ai appelé comme dans mon instruction SQL que je peux utiliser de l'u.Champ1, u.Field2 pour retirer les enregistrements de la table des Utilisateurs qui j'ai alias u. Si j'utilise ma requête comme ceci je dois tirer le terrain avec l'u.u.FieldName. Cela ne semble pas juste pour moi! Voir mon .OrderBy déclaration de voir ce que je veux dire.
  • Si cela fonctionne, et il n'est pas lent, je ne comprends pas ce que vous cherchez. Il ne semble pas être un réel problème
  • Normalement, j'aurais tout à fait d'accord avec vous, mais ça ne fonctionne toujours pas s'asseoir droit avec moi, la façon dont ça fonctionne maintenant, et la jointure est à peu près le seul problème que j'ai. La dynamique dans laquelle/Commande/Sélectionnez les trucs tout fonctionne bien. Si j'ai pris le dessus et a ajouté un autre rejoindre, je voudrais tout d'un coup être avoir besoin de s'identifier mes colonnes comme u.u.u.FieldName, un peu OTT je suis sûr que vous serez d'accord!
  • En Déclarant les colonnes de Jointure 1, puis de nouveau en 2, ça fonctionne. Toutefois, si vous vérifiez les modifications ci-dessus, vous voyez, c'est un peu difficile.
InformationsquelleAutor HungryHippos | 2012-03-08