【问题标题】:Object query in Entity Framework 6Entity Framework 6 中的对象查询
【发布时间】:2015-11-09 19:36:39
【问题描述】:

ObjectQuery 方法出现错误,有人可以帮忙吗?

private void AddProductsToTabbedPanel()
        {
            foreach (TabPage tp in tabControl1.TabPages )
            {
                ObjectQuery<TblProduct> filteredProduct = new ObjectQuery<TblProduct>("Select value p from TblProduct as P", csdbe);

                foreach (TblProduct tpro in filteredProduct)
                {
                    Button btn = new Button();
                    btn.Text = tpro.Description;
                    tp.Controls.Add(btn);
                }
            }
        }

我的逻辑是它根据 TblProduct 的内容在控制选项卡中添加按钮

但我得到了一个错误:

参数 2:无法从 'Coffee_Shop.CoffeeShopDatabaseEntities' 到 'System.Data.Entity.Core.Objects.ObjectContext'

最好的重载方法匹配 'System.Data.Entity.Core.Objects.ObjectQuery.ObjectQuery(字符串, System.Data.Entity.Core.Objects.ObjectContext)' 有一些无效 论据

【问题讨论】:

  • csdbe 是什么类型?
  • 很可能您正在使用面向DbContext 的方法(csdbe 源自DbContext - 不是ObjectContext - 对吧?),这真的没有'不再支持ObjectQuery。这是非常旧的 EF 代码 - 您应该将其升级到更新的方法
  • 最近的方法有链接吗?如果你有这对我有很大帮助。再次感谢您的回复。
  • 为什么使用ObjectQuery和查询字符串?这可能有充分的理由,但如果你可以做到这一点,那就更好了。如果没有,我想知道您是否知道 ObjectQuery 产生 tracked 实体,而较新的 DbContext 方法如 SqlQuery 不会。

标签: c# entity-framework-6.1 objectquery


【解决方案1】:

这里真正的问题是使用实体框架作为运行 sql 代码的一种方式,这不是实体框架的用途。如果您的数据库附加了实体框架,只需执行以下操作即可获取您的实体:

//assuming csdbe is your data context
var filteredProduct = csdbe.TblProduct;

在上面的示例中,您没有过滤您的查询,只是要求所有这些。要过滤上面的示例,请使用 .Where

var filteredProduct = csdbe.TblProduct.Where(x => x.SomeValue == "yourValue");

现在回答你原来的问题:

参数 2:无法从“Coffee_Shop.CoffeeShopDatabaseEntities”转换为“System.Data.Entity.Core.Objects.ObjectContext”

您得到“csdbe”是“CoffeeShopDatabaseEntities”实体的例外情况。所需的第二个参数是数据上下文。

var filteredProduct = new ObjectQuery<TblProduct>("SELECT VALUE P FROM TblProducts AS P", yourContext);

【讨论】:

  • 你好斯蒂芬,谢谢你..我想..我需要了解更多..关于新的实体框架。谢谢你..再次
  • 没问题。我认为随着您对实体框架或任何其他 ORM 的了解更多,您会发现它实际上比以任何方式编写 SQL 更容易使用。
  • 你能帮我解决吗,到目前为止......没有时间阅读更多......因为我需要在明天完成这个项目......这是我的代码.
  • private void AddProductsToTabbedPanel() { foreach (TabPage tp in tabControl1.TabPages ) { ObjectQuery filteredProduct = new ObjectQuery("从 TblProduct 中选择值 p 作为 P", csdbe); foreach (filteredProduct 中的 TblProduct tpro) { Button btn = new Button(); btn.Text = tpro.描述; tp.Controls.Add(btn); } } }
  • 我的答案已经在修复它了。更改此行末尾的 csdbe: ("Select value p from TblProduct as P", csdbe);到您的数据上下文,使其看起来更像这样:(“从 TblProduct 中选择值 P 作为 P”,上下文);将“context”替换为您的数据上下文的名称。您将查询传递给实体而不是数据上下文。
【解决方案2】:

---你的代码应该是这样的

string queryString = @"SELECT VALUE P FROM Tblproducts as P";

foreach (tblproducttype pt in cse.tblproducttypes)
{   
    ObjectContext context =((IObjectContextAdapter) cse).ObjectContext;
    ObjectQuery<tblproduct> filteredproduct = new ObjectQuery<tblproduct>(queryString, context);

    foreach (tblproduct tprod in filteredproduct)
    {
        Button b = new Button();
        b.Text = tprod.description;
        tp.Controls.Add(b);
    }
}

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多