1

我认为我们基本上是在寻找一种可以接收 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")
4

2 回答 2

1

我们无需使用扩展方法即可解决此问题。我们能够使用在 Where 方法中工作的类似查询。

所以,而不是...

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

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

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

然后,只需将包含聚合添加到动态 Linq 库。

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

SelectMany 让我们大吃一惊!

于 2011-03-18T16:20:42.010 回答
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/

于 2013-11-26T13:03:27.530 回答