簡體   English   中英

使用 LINQ 連接后獲取特定對象

[英]Get Specific object after a join using LINQ

我正在嘗試使用 linq 進行連接和 where 條件檢索與實體框架中的表相關的特定類,如下所示:

                var result = (from a in db.Persons
                             join b in db.Person_IDs on a.PersonId equals b.PersonId
                             where b.FaceId == faceId
                             select new
                             {
                                 PersonId = a.PersonId,
                                 Name = a.Name,
                                 Address = a.Address,
                                 Picture = a.Picture,
                                 City = a.City,
                                 Estate = a.Estate,
                                 Phone = a.Phone,
                                 CellPhone = a.CellPhone,
                                 BlackList = a.BlackList
                             }
                             ).FirstOrDefault();

我希望將“結果”對象作為 Person 對象返回。 在上面的例子中,我需要創建一個新的 Person 對象並添加來自結果的字段。

是否可以? 我嘗試了一些方法並使用了一些樣本和研究,但沒有一種替代方法對我有用。

謝謝!

更新 1

好吧,經過一些閱讀,我發現最好的方法是為我的 Person 對象創建一個 DTO 類,並在我的函數中返回這個 DTO 類,如下所示:

PersonDTO result = (from a in db.Persons
                             join b in db.Person_IDs on a.PersonId equals b.PersonId
                             where b.FaceId == faceId
                             select new PersonDTO
                             {
                                 PersonId = a.PersonId,
                                 Name = a.Name,
                                 Address = a.Address,
                                 Picture = a.Picture,
                                 City = a.City,
                                 Estate = a.Estate,
                                 Phone = a.Phone,
                                 CellPhone = a.CellPhone,
                                 BlackList = a.BlackList
                             }
                             ).FirstOrDefault();

            db.Dispose();

            return result;

好吧,它工作得很好,但有件事困擾着我:為什么要創建另一個與 EF 類相同的類? 為什么不能以這種方式使用 EF 類?

我正在處理一張表,但是一個具有 20 個表的程序將迫使我擁有 20 個實體類和 20 個實體 DTO 類!

作為初學者,我認為這種工作方式有點雜亂無章或荒謬,使傳統方式(使用數據讀取器、命令和連接)。 即使更加官僚,它也不需要“重復”的對象。

有人可以提供這個答案嗎?

更新 2

根據要求:由於我的函數中沒有返回匿名類型,因此我嘗試返回實體類 (Person),但是當我這樣做時,我的應用程序執行中出現以下錯誤:

“無法在 LINQ to Entities 查詢中構造實體或復雜類型 'Models.Person'。”

因此,對此的解決方案是創建一個 DTO 類(或一個視圖模型類,等等)。

如果你的數據庫中有Person對象,並且你想要Person對象,你為什么要費心去創建一個匿名類型呢?

為什么不試試

var result = (from a in db.Persons
              join b in db.Person_IDs on a.PersonId equals b.PersonId
              where b.FaceId == faceId
              select a).FirstOrDefault();

你應該能夠做到

var result = (from a in db.Persons 
    join b in db.Person_IDs on a.PersonId equals b.PersonId
    where b.FaceId == faceId
    select new Person
    { 
        PersonId = a.PersonId, 
        Name = a.Name, 
        Address = a.Address, 
        Picture = a.Picture, 
        City = a.City, 
        Estate = a.Estate, 
        Phone = a.Phone, 
        CellPhone = a.CellPhone, 
        BlackList = a.BlackList
    }).FirstOrDefault();

只要 Person 類可訪問,它的位置被導入,並且它具有與上述匹配的屬性的公共 getter/setter,這應該工作。

如果您仍然遇到問題,請嘗試包含您的人員類定義以及您可能會看到的任何錯誤。

編輯:根據您看到的錯誤,我猜您正在嘗試僅選擇此實體上的某些屬性。 EF實際上不會讓你這樣做。 您可以選擇整個實體(通過不指定屬性而只選擇a ),或者您可以創建一個自定義 DTO,您可以像我上面所做的那樣映射到它。

EF 不喜歡不完整的映射,因為它會使狀態對未來的模型修改造成混淆。 在這里看到這個答案。 因此,如果您想避免加載整個實體,請使用自定義 DTO 路線。

你的代碼是正確的!! 選擇此解決方案,因為它的修改最少,只需選擇人員

 person result = (from a in db.Persons
                             join b in db.Person_IDs on a.PersonId equals 
                             b.PersonId
                             where b.FaceId == faceId
                             select new person
                             {
                                 PersonId = a.PersonId,
                                 Name = a.Name,
                                 Address = a.Address,
                                 Picture = a.Picture,
                                 City = a.City,
                                 Estate = a.Estate,
                                 Phone = a.Phone,
                                 CellPhone = a.CellPhone,
                                 BlackList = a.BlackList
                             }
                             ).FirstOrDefault();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM