【问题标题】:How to use a .tag in a LINQ query and pass to another method?如何在 LINQ 查询中使用 .tag 并传递给另一个方法?
【发布时间】:2011-08-31 16:59:20
【问题描述】:

我正在尝试从一个查询中构建一个结果对象,该查询从列表项的标记中获取其 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;
    }
}

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

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”类型的操作数

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

不能隐式转换类型 'System.Linq.IQueryable' 到 'Coke_Hold_Database.Record_HoldData'。 存在显式转换(您是否缺少演员表?

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

【问题讨论】:

  • P.S.您可以显着提高您的性能,使您的 Select + 循环进入存储过程并从您的实体调用 SP。

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


【解决方案1】:

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

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

【讨论】:

  • 正如我所说,我尝试按照您在此处所写的进行投射。得到那个错误
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多