[英]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.