我正在尝试重新设计最初使用Raptier构建的数据访问层。 Raptier生成接受where子句作为参数传递给存储过程的方法。我真的需要保留现有的mesthos签名,所以我的新DAL也需要接受where子句。我想使用更新的数据访问技术和技术,因此考虑使用.Net 4.0中的Entity Framework。
然而,看起来我不能接受动态where子句而不实现一些强烈的reoutines来将它们解析为lamba表达式。有没有我错过的东西?我是否对实体框架感到不满意?
谢谢, 马克
答案 0 :(得分:7)
有两个想法。
1)。 Dynamic LINQ,允许您将运算符定义为字符串。
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<Person>
提供给能够过滤该查询的业务方法:
public static Person[] GetAllPersons(
IEntityFilter<Person> filter)
{
using (var db = ContextFactory.CreateContext())
{
IQueryable<Person> filteredList =
filter.Filter(db.Persons);
return filteredList.ToArray();
}
}
答案 1 :(得分:0)
查看Rick Strahl的博客文章:http://www.west-wind.com/weblog/posts/160237.aspx。他的演示使用Linq to SQL,但它在EF中没有太大的不同。此方法涉及将IQueryable公开给业务层。这不是没有争议,但需要考虑的事情。
公开IQueryable后,您可以针对返回的集合编写LINQ查询。我不承诺你能够使用sprocs,但试一试。
答案 2 :(得分:0)
您可以使用ExecuteStoreQuery方法对数据库执行原始命令。 http://msdn.microsoft.com/en-us/library/ee358769.aspx
答案 3 :(得分:0)
面临同样的问题,现在停止使用的raptier可能是,那么
我有一个线索,因为我使用的是仅支持15个表/视图的精简版。 这是一个捷径,
总是在服务器中使用虚拟测试数据库,并生成所需的类,然后将其与类库解决方案合并,重建解决方案,并继续这样做到你想要的程度,
它的辛苦但它的工作。
需要更多的帮助,很高兴......