我正在嘗試通過加入來增強人的物件。我想對名字和姓氏進行左外連接。然后我想用我可用的方法更新人員物件(此方法回傳一個人員物件)并從那里選擇。
我在這里遇到的問題是有一個空參考例外,我不知道如何防止這種情況。如果我洗掉 DefaultIfEmpty 我得到一個內部聯接,但顯然我想要左外部。我知道通常你會想要處理空值,但我不確定在這種情況下如何正確地做到這一點。
person = from p in person
join epd in enhancedPersonData
on new { p.firstname, p.lastname} equals new { epd.firstname, epd.lastname} into epdJoin
from epdj in epdJoin.DefaultIfEmpty()
select p.UpdatePerson(epdj);
我已經嘗試過以下方法,但它只是一個內部連接:
person = from p in person
join epd in enhancedPersonData
on new { p.firstname, p.lastname} equals new { epd.firstname, epd.lastname}
select p.UpdatePerson(epd);
人:
public class Person
{
public string Firstname{ get; set; }
public string Lastname{ get; set; }
public string Address{ get; set; }
public Person(string firstname, string lastname){
Firstname = firstname;
Lastname = lastname;
}
}
更新人:
public static Person UpdatePerson (this Person schema,
EnhancedPersonData enhancedPersonData)
{
if (!string.IsNullOrEmpty(enhancedPersonData.Address))
{
schema.Address = enhancedPersonData.Address;
}
}
解決方案:
更新人:
public static Person UpdatePerson (this Person schema,
EnhancedPersonData enhancedPersonData)
{
if (!string.IsNullOrEmpty(enhancedPersonData?.Address))
{
schema.Address = enhancedPersonData.Address;
}
}
加入代碼:
person = from p in person
join epd in enhancedPersonData
on new { p.firstname, p.lastname} equals new { epd.firstname, epd.lastname} into epdJoin
from epdj in epdJoin.DefaultIfEmpty()
select p.UpdatePerson(epdj);
uj5u.com熱心網友回復:
如果您使用的是左連接,那么epdj
如果null
在enhancedPersonData
.
用 null: 更新一個人有什么意義 p.UpdatePerson(null);
?
由于類是參考型別,原始人員集合將自動包含更新的人員。將回傳的人員重新分配給它是沒有意義的。您可以放心地丟棄查詢的結果,然后不再需要左連接
_ = from p in person
join epd in enhancedPersonData
on new { p.firstname, p.lastname} equals new { epd.firstname, epd.lastname}
select p.UpdatePerson(epd);
請注意,在 C#_
中是一個discard。
解決方案
洗掉空參考例外
發布代碼后,我會看到您的空參考例外發生的位置。它在行中
if (!string.IsNullOrEmpty(enhancedPersonData.Address))
如果使用左連接,則
enhancedPersonData
可以null
. 因此將行更改為if (!String.IsNullOrEmpty(enhancedPersonData?.Address))
將 IEnumerable 轉換為串列
其他可能的解決方案:因為
person
是IEnumerable<Person>
,所以我不知道真正的資料源是什么。它是一個集合還是資料庫查詢的結果?在后一種情況下,我的方法(沒有左連接,分配給_
)將不起作用。person
但是,您可以通過將其宣告為 a來使其作業List<Person>
。因為否則,每次列舉IEnumerable<Person> person
.
請注意,an不是IEnumerable<T>
集合。它提供了一種列舉集合或資料源的方法。
此外,分配UpdatePerson
應該是
schema.Address = enhancedPersonData.Address; // With a lower case enhancedPersonData
代替
schema.Address = EnhancedPersonData.Address;
否則您可能正在訪問一個靜態屬性,該屬性當然對所有物件都具有相同的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526731.html
標籤:C#林克
下一篇:C# Interlocked 類