ObjectQuery查询及方法

ObjectQuery 类支持对 实体数据模型 (EDM) 执行 LINQ to Entities 和 Entity SQL 查询。ObjectQuery 还实现了一组查询生成器方法,这些方法可用于按顺序构造等效于 Entity SQL 的查询命令。下面是 ObjectQuery 的查询生成器方法以及等效的 Entity SQL 语句:
Distinct,Except,GroupBy,Intersect,OfType,OrderBy,Select,SelectValue,Skip,Top,Union,UnionAll,Where
每个查询生成器方法返回 ObjectQuery 的一个新实例。使用这些方法可以构造查询,而查询的结果集基于前面 ObjectQuery 实例序列的操作。下面来看具体的代码片断:

> Execute方法:

复制代码
using (var edm = new NorthwindEntities())
      {
                string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
                ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql);
                ObjectResult<Customers> results = query.Execute(MergeOption.NoTracking);
                Assert.AreEqual(results.Count(), 10);
                foreach (Customers c in query)
                    Console.WriteLine(c.CustomerID);
      }
复制代码

其中需要说明的是: MergeOption这个枚举类型的参数项,MergeOption有四种值分别是:

> AppendOnly: 只追加新实体,不修改以前获取的现有实体。这是默认行为。

> OverwriteChanges: 将 ObjectStateEntry 中的当前值替换为存储区中的值。这将使用服务器上的数据重写在本地所做的更改。

> PreserveChanges: 将替换原始值,而不修改当前值。这对于在发生开放式并发异常之后强制成功保存本地值非常有用。

> NoTracking: 将不修改 ObjectStateManager,不会获取与其他对象相关联的关系,可以改善性能。

> GetResultType方法:返回查询结果的类型信息.例如:

复制代码
using (var edm = new NorthwindEntities())
            {
                string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
                ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql);
                Console.WriteLine(query.GetResultType().ToString());
                //输出结果为:
                //NorthWindModel.Customers
            }
复制代码

> ToTraceString方法:获取当前执行的SQL语句。

> Where

实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql = "select value c from NorthwindEntities.Customers as c ";
    ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql);
    //使用ObjectParameter的写法               
    query1 = query1.Where("it.CustomerId=@customerid");
    query1.Parameters.Add(new ObjectParameter("customerid", "ALFKI"));
    //也可以这样写
    //ObjectQuery<Customers> query2 = edm.Customers.Where("it.CustomerID='ALFKI'");
    foreach (var c in query1)
        Console.WriteLine(c.CustomerID);
    //显示查询执行的SQL语句
    Console.WriteLine(query1.ToTraceString());
      
    }
复制代码

> First/ FirstOrDefault

实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
    ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql);
    Customers c1 = query.First();
    Customers c2 = query.FirstOrDefault();
    Console.WriteLine(c1.CustomerID);
    Assert.IsNotNull(c2);
    Console.WriteLine(c2.CustomerID);
}
复制代码

> Distinct

实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql = "select value c.City from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
    ObjectQuery<string> query = edm.CreateQuery<string>(esql);
    query = query.Distinct();
    foreach (string c in query)
    {
        Console.WriteLine("City {0}", c);
    }
}
复制代码

> Except:返回两个查询的差集。实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
    ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
    string esql2 = "select value c from NorthwindEntities.Customers as c where c.Country='UK' order by c.CustomerID limit 10";
    ObjectQuery<Customers> query2 = edm.CreateQuery<Customers>(esql2);
    query1 = query1.Except(query2);
    foreach (Customers c in query1)
    {
        Console.WriteLine(c.Country);
        //输出:UK
    }
}
复制代码

> Intersect:返回两个查询的交集。实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
    ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
    string esql2 = "select value c from NorthwindEntities.Customers as c where c.Country='UK' order by c.CustomerID limit 10";
    ObjectQuery<Customers> query2 = edm.CreateQuery<Customers>(esql2);
    query1 = query1.Intersect(query2);
    foreach (Customers c in query1)
    {
        Console.WriteLine(c.Country);
    }
}
复制代码

> Union/UnionAll:返回两个查询的合集,包括重复项。其中UnionAll必须是相同类型或者是可以相互转换的

> Include:可通过此方法查询出与相关的实体对象。实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql1 = "select value c from NorthwindEntities.Customers as c WHERE c.CustomerID ='HANAR'";
    ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
    query1 = query1.Include("Orders");
    foreach (Customers c in query1)
    {
        Console.WriteLine("{0},{1}", c.CustomerID, c.Orders.Count);
        //输出:HANAR,14
    }

}
复制代码

> OfType: 根据制定类筛选元素创建一个新的类型。此类型是要在实体模型中已定义过的。

> OrderBy

实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
    ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
    query1.OrderBy("it.country asc,it.city asc");
    //也可以这样写               
    //query1.OrderBy("it.country asc");
    //query1.OrderBy("it.city asc");
    foreach (Customers c in query1)
    {
        Console.WriteLine("{0},{1}", c.Country, c.City);
    }
}
复制代码

> Select

实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
    ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
    ObjectQuery<DbDataRecord> records = query1.Select("it.customerid,it.country");
    foreach (DbDataRecord c in records)
    {
        Console.WriteLine("{0},{1}", c[0], c[1]);
    }
    Console.WriteLine(records.ToTraceString());
    //SQL输出:
    //SELECT TOP (10)
    //1 AS [C1],
    //[Extent1].[CustomerID] AS [CustomerID],
    //[Extent1].[Country] AS [Country]
    //FROM [dbo].[Customers] AS [Extent1]
    //ORDER BY [Extent1].[CustomerID] ASC
}
复制代码


> SelectValue

实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
    ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
    ObjectQuery<string> records = query1.SelectValue<string>("it.customerid");
    foreach (string c in records)
    {
        Console.WriteLine("{0}", c);
    }
    Console.WriteLine(records.ToTraceString());
    //SQL输出:
    //SELECT TOP (10)
    //[Extent1].[CustomerID] AS [CustomerID]
    //FROM [dbo].[Customers] AS [Extent1]
    //ORDER BY [Extent1].[CustomerID] ASC
}
复制代码


> Skip/Top

实例代码如下:

复制代码
using (var edm = new NorthwindEntities())
{
    string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID ";
    ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
    query1 = query1.Skip("it.customerid asc", "10");
    query1 = query1.Top("10");
    foreach (Customers c in query1)
    {
        Console.WriteLine("{0}", c.CustomerID);
    }
    Console.WriteLine(query1.ToTraceString());
    //SQL输出:
    //SELECT TOP (10)
    //[Extent1].[CustomerID] AS [CustomerID]
    //FROM [dbo].[Customers] AS [Extent1]
    //ORDER BY [Extent1].[CustomerID] ASC
}
复制代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ObjectQuery是一个类,它支持对实体数据模型(EDM)执行LINQ to Entities和Entity SQL查询。它还实现了一组查询生成器方法,可以用于按顺序构造等效于Entity SQL的查询命令。这些查询生成器方法包括Distinct、Except、GroupBy、Intersect、OfType、OrderBy、Select、SelectValue、Skip、Top、Union、UnionAll和Where。每个查询生成器方法都会返回一个新的ObjectQuery实例,可以基于前面ObjectQuery实例序列的操作构造查询的结果集。\[1\] 在使用ObjectQuery时,可以通过创建ObjectQuery实例并使用查询生成器方法来构造查询。可以使用LINQ表达式或Entity SQL语句来定义查询的条件和操作。还可以使用ObjectParameter来传递参数给查询。例如,可以使用CreateQuery方法创建一个ObjectQuery实例,并使用Where方法来添加查询条件,然后使用Parameters属性添加参数。最后,可以通过遍历查询结果来获取查询的结果集。\[2\] 在DETR模型中,Object Query是由Transformer Decoder的输出层生成的。每个输出位置都被分配给一个Object Query,其向量表示可以看作是对目标类别和位置的编码。在预测时,每个Object Query与Encoder输出的特征图进行匹配,以确定每个Object Query应该与特征图中的哪个位置相关联。然后,使用RoI Align从特征图中提取与每个Object Query相关的区域特征,最终生成与每个Object Query对应的检测结果。\[3\] #### 引用[.reference_title] - *1* *2* [ObjectQuery查询方法](https://blog.csdn.net/weixin_34234721/article/details/91672085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【计算机视觉 | 目标检测】Object query的理解](https://blog.csdn.net/wzk4869/article/details/129908100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值