2012-03-08 11 views
5

Lurker thời gian dài, áp phích lần đầu tiên. Tôi đã tìm thấy một số câu trả lời tốt ở đây trong quá khứ vì vậy con số tôi sẽ đến đây và xem nếu tôi có thể nhận được một chút giúp đỡ!Nhiều lần tham gia trong truy vấn Khung thực thể

Tôi khá mới đối với LINQ và tôi đang sử dụng Khuôn khổ thực thể cho đối tượng của mình. Tôi có một tập tin .edmx trong dự án của tôi.

Trước hết tôi nhập khẩu bằng cách sử dụng lớp System.Linq.Dynamic từ các trang mẫu đi kèm với VS 2010, vì vậy tôi có thể thêm vào trang web của tôi:

sử dụng System.Linq.Dynamic;

Vấn đề là, tôi không nghĩ rằng việc tham gia của tôi hoạt động tốt.

Đây là mã hiện tại của tôi:

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

Làm thế nào tôi có thể viết nó để nó hoạt động như thế này sẽ trong SQL bình thường không?

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 

tôi cần phải giữ các điều khoản .Where năng động và tên trường .Chọn, vấn đề là bạn có thể nhìn thấy ngay bây giờ là tôi cần phải làm gì để lấy lại uuCompanyName lĩnh vực u.CompanyName vì nó là trong tôi tham gia hai lần.

Tôi đã googled cho điều này trong một thời bây giờ nhưng không có con xúc xắc nào được nêu ra.

Bất kỳ trợ giúp nào được đánh giá cao!

EDIT - đây là truy vấn hiện tại của tôi. Nó hoạt động nhưng nó là một chút của một cơn ác mộng để nhìn.

Hãy theo tôi. Tôi muốn bao gồm tất cả mọi thứ ở đây nếu tôi có thể thậm chí nếu nó là một chút nhiều.

Lựa chọn cột động là điều bắt buộc đối với tôi. Nếu không tôi cũng có thể gắn bó với bộ điều hợp bảng của tôi và lưu trữ procs. Việc có thể giảm truy vấn để trả về ít dữ liệu hơn là một trong những mục tiêu của tôi với điều này. Nếu ai có thể đề xuất cải tiến, tôi là tất cả tai?

Tôi không thể tìm cách dừng việc tham gia vào các mục con, trong SQL khi tôi tham gia, tôi chỉ cần trả lại các cột mà tôi muốn bằng câu lệnh SELECT của mình.

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

Đây là những gì SQL chạy ở chế độ nền:

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 
+0

Ý của bạn là gì khi bạn nói * Tôi không nghĩ rằng việc tham gia của tôi hoạt động tốt *? Nó có trả lại các hồ sơ chính xác không? Nó có chậm không? Bạn đã thấy sql đã tạo chưa? – Aducci

+0

Thông thường khi tôi tham gia như thế này, tôi có thể sử dụng tên bí danh của bảng để trả về các bản ghi mà tôi muốn. f.ex nếu tôi đã gọi nó như trong câu lệnh SQL của tôi, tôi có thể sử dụng u.Field1, u.Field2 để kéo các bản ghi trở lại từ bảng Người dùng mà tôi đã đặt bí danh là u. Nếu tôi sử dụng truy vấn của tôi như thế này tôi phải kéo lĩnh vực trở lại với u.u.FieldName. Điều này dường như không đúng với tôi! Xem câu lệnh .OrderBy của tôi để xem ý tôi là gì. – HungryHippos

+0

Nếu nó hoạt động và nó không phải là chậm, tôi không hiểu những gì bạn đang tìm kiếm.Có vẻ như không phải là một vấn đề thực tế – Aducci

Trả lời

2

Không có nhiều của một câu trả lời, nhưng lời khuyên. Đầu tiên, hãy lấy LinqPad. Khi thực hiện điều chỉnh truy vấn, nó là vô giá. Thứ hai, đặt cược của tôi là bạn đang nhận được một truy vấn rất lớn là kết quả của việc sử dụng. Linq2Entities có một thói quen khó chịu khi tạo các phép chiếu (các truy vấn con) mỗi lần bạn tham gia. Tôi sẽ dành một số thời gian chất lượng với LinqPad và truy vấn của tôi cho đến khi tôi nhận được truy vấn tôi muốn.

+0

cảm ơn, sẽ có một trò chơi xung quanh với LinqPad và xem những gì là gì :) – HungryHippos

+0

Oh người đàn ông này chỉ được vui hơn. Sẽ cập nhật OP của tôi nếu tôi có thể với những gì tôi hiện có. – HungryHippos

+0

OK vì vậy tôi đã chơi với LinqPad nhưng nó không thực sự dễ dàng hơn cho tôi, vì không có tính năng mát mẻ như autocomplete vì vậy tôi không có ý tưởng nếu những gì tôi đang gõ thực sự làm việc. Nếu bạn kiểm tra OP của tôi ở trên, bạn sẽ thấy những gì tôi hiện đang chạy nhưng nó đáng chú ý chậm hơn so với TableAdapter hiện tại của tôi và phương pháp lưu trữ Proc. – HungryHippos