2012-01-02 96 views
0

在循環遍歷一個列表中的記錄時,我想在包含該項目的更多信息的另一列表中找到相應的行。嘗試使用LINQ從第一個列表中獲取此信息時,出現轉換錯誤。LINQ從一個通用列表中選擇以將值分配給另一個

public class qtyAvail 
{ 
    public string itemNumber; 
    public string qtyAv; 
} 

public class variance 
{ 
    public string siteID; 
    public string itemNumber; 
    public string varQty; 
} 

    public void saveVariance(Context context) 
    { 
     var settings = PreferenceManager.GetDefaultSharedPreferences(context); 
     var siteID = settings.GetString("siteID", null); 
     updateInv(siteID); 

     var inst = new InventoryApp(); 
     List<variance> ilist = new List<variance>(); 
     List<qtyAvail> avail = new List<qtyAvail>(); 
     SqliteDataReader dr; 

     var connection = new SqliteConnection("Data Source=" + dbPath); 
     connection.Open(); 
     var c = connection.CreateCommand(); 
     c.CommandText = "Select ItemNmbr, OnHnd - Alloc From PartInfo"; 
     dr = c.ExecuteReader(); 

     while (dr.Read()) 
     { 
      qtyAvail qa = new qtyAvail(); 
      qa.itemNumber = dr[0].ToString(); 
      qa.qtyAv = dr[1].ToString(); 
      avail.Add(qa); 
     } 
     dr.Close(); 
     c.CommandText = "Select * From Items"; 
     dr = c.ExecuteReader(); 

     while (dr.Read()) 
     { 
      variance v = new variance(); 
      v.siteID = siteID; 
      v.itemNumber = dr[0].ToString(); 
      v.varQty = from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv; 
      ilist.Add(v); 
     } 
     dr.Close(); 
     connection.Close(); 

     inst.saveVariance(siteID, ilist.ToArray()); 
    } 

當我構建解決方案,我得到

不能鍵入 'System.Collections.Generic.IEnumerable<string>' 隱式轉換爲 'string'

在這裏我使用LINQ分配v.varQty行。我確信有一些簡單的東西我缺少,但只是找不到正確的轉換,轉換等。我也意識到,我可以很容易地只是執行Sqlite表上的選擇來獲取信息,而不是使用列表,但我正在試圖將所有這些LINQ的東西都拿出來,所以我想讓它也以這種方式工作。

+0

varqQty是一個字符串,您的IEnumerable字符串的選擇退貨,所以很明顯你不能分配,你的WHERE條件返回多個字符串.. – 2012-01-02 18:30:21

回答

2
v.varQty = from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv; 

查詢返回一個IEnumerable<string>而不是單個字符串 - 因爲varQty是一個字符串使用FirstOrDefault()這裏:

v.varQty = (from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv).FirstOrDefault(); 

或者用點表示更短:

v.varQty = avail.Where(q => q.itemNumber == dr[1].ToString()).FirstOrDefault(); 
1

from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv;

上述LINQ查詢返回的字符串的集合。你可以不是一個集合分配給您的字符串類型變量

您應該改用FirstOrDefault()將來自枚舉集合

只返回一個記錄試試這個

(from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv).FirstOrDefault();

0

您指定的行:

v.varQty = from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv; 

試圖字符串列表分配到一個字符串,因此它失敗。

您需要獲取單個項目並分配該項目。您有幾種選擇 - 使用First()FirstOrDefault(),它們的工作方式與您的預期相同。或者使用Single(),如果正好是列表中的一個項目,則會引發異常。

在這個例子中,我使用FirstOrDefault

v.varQty = (from q in avail where q.itemNumber == dr[1].ToString() 
      .FirstOrDefault(); 
相關問題