![](/img/trans.png)
[英]LINQ DefaultIfEmpty issue on object with non-nullable value type property
[英]Non-Nullable value type issue when LEFT JOIN in Linq
我打算在一個需要使用Linq的WinForms項目上工作,但我對它一無所知,所以我才開始學習。
閱讀有關Linq的教程后,我使用Microsoft Windows SDK附帶的SqlMetal
工具創建了System.Data.Linq.DataContext
。 我使用的數據庫是“Northwind” 。
我能夠進行如下簡單查詢:
Northwind db = new Northwind("Data Source=local;Initial Catalog=Northwind;Integrated Security=True");
var query = from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID
select new
{
Customer_ID = c.CustomerID,
Customer_Name = c.ContactName,
Order_ID = o.OrderID
};
然后我在DataGridView
顯示結果,並且順利進行。
但是現在我面臨着一個我無法解決的問題。
我嘗試修改以前的查詢以進行LEFT OUTER JOIN
,所以我做的是以下內容:
var query = from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID into j
from or in j.DefaultIfEmpty()
select new
{
Customer_ID = c.CustomerID,
Customer_Name = c.ContactName,
Order_ID = or.OrderID
};
但是,當我嘗試在DataGridView
顯示這些數據集時,會引發錯誤:
The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type.
我知道這個問題是由沒有“訂單”的“客戶”引起的,因此系統會嘗試將null
值設置為int
變量。
但是, 如何在沒有此錯誤的情況下進行LEFT OUTER JOIN
?
先感謝您。
您不應該將類型轉換為字符串。 簡單地將它轉換為等效的可空類型:
var query = from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID into j1
from or in j1.DefaultIfEmpty()
select new
{
Customer_ID = c.CustomerID,
Customer_Name = c.ContactName,
Order_ID = (int?)or.OrderID
};
我想我剛剛找到答案:
var query = from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID into j1
from or in j1.DefaultIfEmpty()
select new
{
Customer_ID = c.CustomerID,
Customer_Name = c.ContactName,
Order_ID = or.OrderID == null ? "[null]" : or.OrderID.ToString()
};
但如果有人有更好的答案,我會很感激
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.