【问题标题】:Query By Entity (Example)按实体查询(示例)
【发布时间】:2009-03-24 16:27:40
【问题描述】:

我正在寻找一种工具,它可以从给定的实体动态生成 Linq to Entity 查询,如果您愿意的话,可以使用 Query By Entity(示例)。给定一个实体及其所属的对象上下文,生成器返回一个 ObectQuery 或 IQueryable,可以进一步修改或执行。理想情况下,查询构建器不会直接引用实体模型,而是使用对象上下文从模型构建查询。我想象代码看起来像这样:

        QueryBuilder qb = new QueryBuilder(new EntitiesContext());
        Customer c = new Customer();
        qb.Add(c);  
        c.FirstName = "Jim";
        var qry = qb.BuildQuery();
        int total = qry.Count();

基础查询如下所示:

var query = from c in ctx.Customers
            where c.FirstName == "Jim"
            select c;

这样的东西是否已经存在于某个地方?我可以想象自己编写这样的代码,但我宁愿开始使用已经存在的东西。

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    我不确定你的目标是什么,如果你想发布一些关于你的上下文的更多信息(一个实际问题),但 Dynamic Linq 可能会帮助你动态构建 linq 查询:

    http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    维比

    【讨论】:

      【解决方案2】:

      我并没有真正看到 QueryBuilder 中的价值。如果它像您的示例一样简单,您只能使用它来查找完全匹配。如果您需要更复杂的查询,最好直接使用 Linq。

      您知道可以链接查询吗?这可能不是您正在寻找的,但您可以做到

      IQueryable<Customers> source=context.Customers;
      
      if (...)
      {
        source = from c in source
                 where c.FirstName.StartsWith("Jim")
                 select c;
      }
      
      if (...)
      {
        source = from c in source
                 where contries.Contains(c.Country)
                 select c;
      }
      
      // ...
      

      【讨论】:

        【解决方案3】:

        您可以使用动态 Linq 在运行时构建您的 Linq 表达式 - 只需将方法附加到现有的 Linq 查询(在执行之前)。 话虽如此,正如 Chris 所提到的,“QueryBuilder”类的概念值得怀疑。

        严格来说,Linq 本身就是一个查询构建器,因为它接受一个 Linq 语句并构建一个“图”,然后查询提供程序可以使用它来完成基础工作(为 Linq-To-SQL 编译 SQL 语句,或枚举 Linq-For-Objects 的对象)。 如果您想为最终用户提供动态构建查询的能力,请考虑通过添加 Chris 指出的查询方法来创建构建 Linq 语句的 UI。请记住,使用 Linq 查询,您可以添加任意数量的表达式 - 查询仅在枚举器被触发时执行。

        即要选择名为 Jim 的 65 岁以下最年长的客户:

        Dim qry = From customer in DataContext.Customers
        qry = qry.Where( Function (c as Customer) c.Name="Jim" )
        qry = qry.Where( Function (c as Customer) c.Age < 65 )
        qry = qry.OrderByDescending( Function (c as Customer) c.Age )
        qry = qry.Take(1) 
        Dim oldJim as Customer = qry.FirstOrDefault()
        

        FirstOrDefault 方法,就像使用 ToArray 或 For Each 一样,会触发枚举器并因此处理查询。

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-16
          • 2023-02-23
          • 1970-01-01
          • 2020-01-17
          • 2014-04-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多