2017-06-07 20 views
0

讓用戶成爲包含典型用戶數據(名稱,電子郵件...)的數據庫,其中ID爲主鍵。從SQL服務器提取包含所有已購買應用程序列表的用戶列表(映射表)

Applications成爲一個數據庫,存儲一個ID爲主鍵的應用程序(名稱,開發人員...)的列表。

UsersApps成爲兩者之間的映射表,使用主鍵。 UsersApps因此存儲行..., {102, user1_Id, appA_Id}, {103, userN_ID, appB_Id}, {104, user1_Id, appC_Id}, ... 等等。

我想檢索用戶數據的列表{name, email, List<Application> boughtApps}

我在努力尋找一個LINQ要求做到這一點,我試圖做的兩個步驟,得到一個大表,然後建立每個用戶的列表的應用程序。

  var q1 = from user in _dbContext.Users 
        join appUti in _dbContext.AppUsers on user.Id equals appUti.UsersId 
        join app in _dbContext.Applications on appUti.ApplicationId equals app.Id 
        orderby user.Id 
        select new UserDataWithApp { Id = user.Id, Name = user.Name, firstName= user.FirstName, Email = user.Email, App = app }; 

然後解析q1.toList()構建我的所需結果列表。

 var qRes = q1.ToList(); 
     int i = 0; 
     int j = 0; 
     while (i<qRes.Count()) 
     { 
       listUsersWithApps[j] = qRes[i]; 
       while (qRes[i].Id == listUsersWithApps[j].Id) // llist is ordered !! 
       { 
        listUsersWithApps[j].Apps.Add(qRes[i].Apps[0]); 
        i++; 
       } 
       j++; 
    } 

難道還有更好的辦法嗎?

回答

1

您可以使用導航屬性,以允許以下:

var userApps = context.Users.Select(u => new UserWithApp(u.Name, u.Email, u.Applications)) 

只需添加到下面來User

public virtual ICollection<Application> Applications { get; set; } 

,並Application

public virtual ICollection<Users> Users { get; set; } 

這樣你就可以「導航「你的實體之間並寫入以下查詢(ju ST適應你的順序,併入圍哪些用戶數據):

var userApps = from user in context.Users 
       select new UserDataWithApp { ..., BoughtApps = user.Applications } 

在這裏看到一個例子:http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

或其他有趣的博客:https://lostechies.com/jimmybogard/2014/03/12/avoid-many-to-many-mappings-in-orms/

+0

對不起,我不明白你怎麼去從流暢的api到你的一個班輪:(無論如何,我不能再配置數據庫,我使用了一個自動發電機。 – Poutrathor

+0

試着瞭解第一個鏈接中的示例。不要專注於linq查詢,這並不重要。你不需要修改你的數據庫結構。我將編輯我的帖子以添加一些細節。 –

相關問題