LINQ从一个泛型列表中选择赋值给另一个泛型列表

本文关键字:泛型 列表 选择 赋值 另一个 一个 LINQ | 更新日期: 2023-09-27 18:19:10

在循环遍历一个列表中的记录时,我想在另一个列表中找到对应的行,其中包含该项的更多信息。当尝试使用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的东西,所以我想让它也以这种方式工作。

LINQ从一个泛型列表中选择赋值给另一个泛型列表

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();

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();

您指定的行:

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();