繁体   English   中英

LINQ从一个通用列表中选择以将值分配给另一个

[英]LINQ Select From One Generic List to Assign Value to Another

在循环浏览一个列表中的记录时,我想在另一个列表中找到对应的行,其中包含该项目的更多信息。 尝试使用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内容,所以我也希望它也能以这种方式工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM