扩展方法采用动态构建的搜索表达式?

时间:2011-03-16 16:56:25

标签: linq extension-methods dynamic-linq

我认为我们基本上正在寻找一种可以接受IQueryable的扩展方法,并根据整个查询语句而不仅仅是where语句返回IQueryable。

我们希望搜索方法的示例:

IRepository<Person> repository = new Repository<Person>();
var results = repository.GetQuery().Include("Names").Search([dynamic linq here]);

我们目前在where方法

中构建动态linq语句
IRepository<Person> repository = new Repository<Person>();
var results = repository.GetQuery().Include("Names").Where([dynamic linq here]);

该方法的问题在于我们希望在实际的动态linq查询中包含SelectMany和Select。除非您实际进入子属性的子属性,否则不能在Where方法中使用SelectMany。我们想做类似下面的动态linq语句。

SelectMany("Names").Where("LastName.Contains(@0)", "Smith").Select("Person")

2 个答案:

答案 0 :(得分:1)

我们在不使用扩展方法的情况下解决了这个问题。我们能够使用在Where方法中工作的类似查询。

所以不是......

SelectMany("Names").Where("LastName.Contains(@0)", "Smith").Select("Person") 

我们能够使用以下查询获得相同的结果,该查询可以在Where方法中。

Where.("Names.Select(LastName).Contains(@0)", "Smith)

然后只需要在Dynamic Linq库中添加Contains Aggregate。

http://blog.walteralmeida.com/2010/05/advanced-linq-dynamic-linq-library-add-support-for-contains-extension-.html

SelectMany让我们一起疯狂追逐!

答案 1 :(得分:0)

查看此nuget包:NinjaNye.SearchExensions

它使您能够执行以下操作:

var repository = new Repository<Person>();
var results = repository.GetQuery().Search(p => p.LastName, "Smith");

连接到sql会产生以下内容:

SELECT [Extent1].[Id] AS [Id], 
       ... [other properties],
       [Extent1].[LastName] AS [LastName] 
FROM   [dbo].[Person] AS [Extent1]
WHERE  ([Extent1].[LastName] LIKE N'%Smith%')

使用表达式树构建查询,因此结果是干净的。 在这里查看源代码: https://github.com/ninjanye/SearchExtensions/