我正在尝试从查询中构建结果对象,该查询从列表项的标记中获取其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'。 存在显式转换(您是否错过了演员?
这很奇怪,因为如果我试图转换它,我不会错过演员阵容。我尝试过,解析,转换和转换。都有同样的错误。我很难过。有什么帮助吗?
答案 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();