C# 在实体框架中使用动态where子句

C# 在实体框架中使用动态where子句,c#,entity-framework,data-access-layer,C#,Entity Framework,Data Access Layer,我正在尝试重新设计最初使用Raptier构建的数据访问层。Raptier生成接受where子句作为参数传递到存储过程的方法。我真的需要保留现有的mesthos签名,所以我的新DAL也需要接受where条款。我想使用最新的数据访问技术和技巧,所以我考虑使用.NET4.0中的实体框架 然而,看起来我不能接受动态where子句,而不实现一些密集的例程来将它们解析为lamba表达式。我错过了什么吗?我使用实体框架是否运气不佳 谢谢, Marc在这里查看Rick Strahl的博客帖子:。他的演示使用LI

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

然而,看起来我不能接受动态where子句,而不实现一些密集的例程来将它们解析为lamba表达式。我错过了什么吗?我使用实体框架是否运气不佳

谢谢,
Marc

在这里查看Rick Strahl的博客帖子:。他的演示使用LINQtoSQL,但在EF中不会有太大的不同。这种方法涉及向业务层公开IQueryable。这不是没有争议,但这是一个值得考虑的问题。
公开IQueryable后,可以针对返回的集合编写LINQ查询。我不能保证您能够使它与存储过程一起工作,但请尝试一下。

您可以使用ExecuteStoreQuery方法对数据库执行原始命令。
我想到了两个想法

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

var result = Northwind.Products
    .Where("CategoryId=2 And UnitPrice>3")
    .OrderBy("SupplierId");
2) 。使用
EntityFilter
(请参见代码)这样的工具,可以定义如下过滤器:

IEntityFilter<Person> entityFilter =
    from person in EntityFilter<Person>.AsQueryable()
    where person.Name.StartsWith("a")
    where person.Id < 100
    select person;
IEntityFilter entityFilter=
来自EntityFilter.AsQueryable()中的人员
其中person.Name.StartsWith(“a”)
其中person.Id<100
选择人员;
您可以向能够过滤该查询的业务方法提供
IEntityFilter

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

        return filteredList.ToArray();
    }
}
publicstaticperson[]getallperson(
IENTITY过滤器(过滤器)
{
使用(var db=ContextFactory.CreateContext())
{
可读取过滤器列表=
过滤器。过滤器(分贝人);
返回filteredList.ToArray();
}
}

面临同样的问题,现在停产的Rappier很可能是

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

始终在服务器中创建一个虚拟测试数据库,生成所需的类,然后将其与类库解决方案合并,重新生成解决方案,然后继续执行所需的操作

这很辛苦,但它的工作


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

也许您应该给我们看一些代码。我想很多人都不知道说唱歌手斯图夫是什么样子。史蒂文的选择1看起来和我们现在做的最接近。这也许行得通!谢谢大家的回复!动态LINQ看起来非常整洁。