【问题标题】:Using dynamic where clauses in Entity Framework在实体框架中使用动态 where 子句
【发布时间】:2011-05-11 01:03:50
【问题描述】:

我正在尝试重新设计最初使用 Raptier 构建的数据访问层。 Raptier 生成的方法接受 where 子句作为要传递给存储过程的参数。我真的需要保留现有的 mesthos 签名,所以我的新 DAL 也需要接受 where 子句。我想使用最新的数据访问技术和技巧,因此正在考虑使用 .Net 4.0 中的 Entity Framework。

但是,看起来我不能接受动态 where 子句而不执行一些密集的重例以将它们解析为 Lamba 表达式。有什么我错过的吗?我对实体框架不走运吗?

谢谢, 马克

【问题讨论】:

  • 也许你应该给我们看一些代码。我想很多人都不知道 Raptier 的样子。

标签: c# entity-framework data-access-layer


【解决方案1】:

在此处查看 Rick Strahl 的博文:http://www.west-wind.com/weblog/posts/160237.aspx。他的演示使用 Linq to SQL,但在 EF 中并没有太大的不同。这种方法涉及将 IQueryable 暴露给业务层。这并非没有争议,但值得考虑。

通过公开 IQueryable,您可以针对返回的集合编写 LINQ 查询。我不保证你可以让它与 sprocs 一起工作,但试试看吧。

【讨论】:

    【解决方案2】:

    您可以使用 ExecuteStoreQuery 方法对数据库执行原始命令。 http://msdn.microsoft.com/en-us/library/ee358769.aspx

    【讨论】:

      【解决方案3】:

      想到了两个想法。

      1)。 Dynamic LINQ,它允许您将 where 运算符定义为字符串。

      var result = Northwind.Products
          .Where("CategoryId=2 And UnitPrice>3")
          .OrderBy("SupplierId");
      

      2)。使用EntityFilter<T>(参见代码here),它允许您定义这样的过滤器:

      IEntityFilter<Person> entityFilter =
          from person in EntityFilter<Person>.AsQueryable()
          where person.Name.StartsWith("a")
          where person.Id < 100
          select person;
      

      您可以将IEntityFilter&lt;Person&gt; 提供给能够过滤该查询的业务方法:

      public static Person[] GetAllPersons(
          IEntityFilter<Person> filter)
      {
          using (var db = ContextFactory.CreateContext())
          {
              IQueryable<Person> filteredList =
                  filter.Filter(db.Persons);
      
              return filteredList.ToArray();
          }
      }
      

      【讨论】:

      • Steven 的选项 1 看起来最接近我们现在所做的。这可能行得通!感谢大家的回复!
      • Dynamic LINQ 看起来很整洁。
      【解决方案4】:

      面临同样的问题,现在 raptier 停产可能是,好吧

      我有一个线索,因为我使用的是仅支持 15 个表/视图的 lite 版本.. 这是一条捷径,,

      始终在服务器中获取一个虚拟测试数据库,并生成您想要的类,然后将其与您的类库解决方案合并,重新构建解决方案,然后继续进行到您想要的程度,

      它很费力,但它的工作。

      需要更多帮助,很高兴...

      【讨论】:

        猜你喜欢
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 2019-10-13
        • 2010-11-08
        • 1970-01-01
        相关资源
        最近更新 更多