簡體   English   中英

在Linq中LEFT JOIN時出現非Nullable值類型問題

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

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