在循环浏览一个列表中的记录时,我想在另一个列表中找到包含该项目的更多信息的相应行。尝试使用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表上执行select来获取信息而不是使用列表,但是我试图找出所有这些LINQ的东西,所以我想让它以这种方式工作。
答案 0 :(得分:2)
v.varQty = from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv;
您的查询返回IEnumerable<string>
而不是单个字符串-since 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 :(得分:1)
from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv;
以上linq查询返回一个字符串集合。您不能将集合分配给String类型变量
您应该使用FirstOrDefault()
,它只返回该可枚举集合中的一条记录
试试这个
(from q in avail where q.itemNumber == dr[1].ToString() select q.qtyAv).FirstOrDefault();
答案 2 :(得分: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();