C# 在实体框架中使用动态where子句
我正在尝试重新设计最初使用Raptier构建的数据访问层。Raptier生成接受where子句作为参数传递到存储过程的方法。我真的需要保留现有的mesthos签名,所以我的新DAL也需要接受where条款。我想使用最新的数据访问技术和技巧,所以我考虑使用.NET4.0中的实体框架 然而,看起来我不能接受动态where子句,而不实现一些密集的例程来将它们解析为lamba表达式。我错过了什么吗?我使用实体框架是否运气不佳 谢谢,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
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看起来非常整洁。