如何在LINQ查询中使用.tag并传递给另一个方法?

时间:2011-05-24 07:14:34

标签: c# .net linq linq-to-sql

我正在尝试从查询中构建结果对象,该查询从列表项的标记中获取其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是从datacontext创建的对象。 Record_HoldData.HoldID的类型为int。我得到的错误是:

  

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

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

  

无法隐式转换类型   'System.Linq.IQueryable'   至   'Coke_Hold_Database.Record_HoldData'。   存在显式转换(您是否错过了演员?

这很奇怪,因为如果我试图转换它,我不会错过演员阵容。我尝试过,解析,转换和转换。都有同样的错误。我很难过。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

取消存储在int媒体资源中的Tag

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

答案 1 :(得分:1)

事实证明,这是让编译器知道在这种特殊情况下只有一个结果的问题。我添加了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();