我认为我们基本上正在寻找一种可以接受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")
答案 0 :(得分:1)
我们在不使用扩展方法的情况下解决了这个问题。我们能够使用在Where方法中工作的类似查询。
所以不是......
SelectMany("Names").Where("LastName.Contains(@0)", "Smith").Select("Person")
我们能够使用以下查询获得相同的结果,该查询可以在Where方法中。
Where.("Names.Select(LastName).Contains(@0)", "Smith)
然后只需要在Dynamic Linq库中添加Contains Aggregate。
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/