如何在 LINQ 查询中使用 .tag 并传递给其他方法

本文关键字:方法 其他 tag LINQ 查询 | 更新日期: 2023-09-27 17:57:24

我正在尝试从查询构建一个结果对象,该查询从列表项上的标记中获取其 where 子句。下面是构建列表的代码:

var holds = (from a in db.Record_HoldDatas
             join b in db.LUT_Flavors on a.Flavor equals b.ID
             where a.HoldStatus == "Open"
             orderby a.DateOpened descending
             select new { a.HoldID, a.Package, b.flavor, a.DateOpened }).ToList();
DateTime thenTime;
TimeSpan span;
foreach (var items in holds)
{
    ListViewItem item = new ListViewItem(items.HoldID.ToString());
    item.Tag = (int)items.HoldID;
    //determine age
    thenTime = (DateTime)items.DateOpened;
    span = DateTime.Now - thenTime;
    //add age
    item.SubItems.Add(span.TotalHours.ToString("0.0"));
    lstvHolds.Items.Add(item);
    //add flavor
    item.SubItems.Add(items.flavor.ToString());
    //add package
    item.SubItems.Add(items.Package.ToString());
    if (span.TotalHours >= 48)
    {
        item.BackColor = Color.Red;
    }
    else if (span.TotalHours >= 36 && span.TotalHours < 48)
    {
        item.BackColor = Color.Yellow;
    }
    else
    {
        item.BackColor = Color.Green;
    }
}

从这里开始,我想使用所选项目中的标记值,使用该标记作为 WHERE 子句中的约束,从 DataContext 创建一个新对象:

private void lstvHolds_DoubleClick(object sender, EventArgs e)
{        
    //create instance of the selected record
    var existingRecord =  from a in db.Record_HoldDatas
                          where a.HoldID == lstvHolds.SelectedItems[0].Tag
                          select a;
    //open the hold window for viewing            
    frmNewFGHold viewHold = new frmNewFGHold("view", existingRecord);
    viewHold.Show();
}

Record_HoldData是从数据上下文创建的对象。Record_HoldData.HoldID 的类型为 int。我得到的错误是:

运算符 '==' 不能应用于类型为 'int' 和 'object' 的操作数

当我显示对象时。ToString(),它显示了正确的值,但是当我尝试将其解析为 int 时,我收到此错误:

无法隐式转换类型 'System.Linq.IQueryable' 自 "Coke_Hold_Database.Record_HoldData"。 存在显式转换(您是否缺少强制转换?

这很奇怪,因为如果我尝试转换它,我不会错过演员表。我尝试过,解析,转换和铸造。所有这些都具有相同的错误。我被难住了。有什么帮助吗?

如何在 LINQ 查询中使用 .tag 并传递给其他方法

将存储在 Tag 属性中的int拆箱:

where a.HoldID == (int)lstvHolds.SelectedItems[0].Tag

事实证明,这是一个让编译器知道在这种特殊情况下只有一个结果的问题。我添加了Single(),它起作用了:

int ID = (Int32)lstvHolds.SelectedItems[0].Tag;
//create instance of the selected record
Record_HoldData existingRecord = (Record_HoldData)
(from a in db.Record_HoldDatas
where a.HoldID == ID
select a).Single();
//open the hold window for viewing            
frmNewFGHold viewHold = new frmNewFGHold("view", existingRecord);
viewHold.Show();