我在IQueryable
(例如)上有C#扩展方法。 FindNewCustomers()
和FindCustomersRegisteredAfter(int year)
等等,我用它们将LINQ to SQL“查询”链接在一起。LINQ-to-SQL编译查询问题(作为未编译查询)
现在我的问题:我想创建编译查询,例如:
private static Func<MyDataContext, SearchInfo, IQueryable<Customer>>
CQFindAll =
CompiledQuery.Compile((MyDataContext dc, SearchInfo info) =>
dc.Contacts.Select(c => c).FindCustomersRegisteredAfter(info.RegYear)
.OrderBy(info.OrderInfo)
.Skip(info.SkipCount)
.Take(info.PageSize));
的FindCustomersRegisteredAfter(int year)
方法是扩展方法采取IQueryable
和返回相同。 OrderBy
方法也是一种扩展方法(System.Linq.Dynamic),它根据字符串创建一个动态表达式(例如,“FirstName ASC”将按升序排列字段FirstName)。 Skip
和Take
是内置方法。
以上(不是编译查询,而是定期查询)工程完美。有一次,我把它放在一个编译的查询,我打了以下错误:
Method 'System.Linq.IQueryable`1[Domain.Customer] FindCustomersRegisteredAfter[Customer](System.Linq.IQueryable`1[Domain.Customer], Int32)' has no supported translation to SQL.
再次,这个完美的作品如果查询非编,只是一个普通的LINQ查询。该错误只出现在CompiledQuery.Compile()中时才会出现。
帮助??!
编辑:如果我创建通过VAR查询查询=(...)同样的方式CompiledQuery.Compile内,这是SQL生成:
SELECT [t1].[Id], [t1].[FirstName], [t1].[LastName],
[t1].[RegYear], [t1].[DeletedOn]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[LastName]) AS [ROW_NUMBER],
[t0].[Id], [t0].[FirstName], [t0].[LastName], [t0].[RegYear],
[t0].[DeletedOn]
FROM [dbo].[Contacts] AS [t0]
WHERE ([t0].[RegYear] > @p0) AND ([t0].[DeletedOn] IS NULL)
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2
ORDER BY [t1].[ROW_NUMBER]
所以你看到, SQL是完全可翻译的,所以我只需要填写@ p0,@ p1和@ p2就可以重复使用! CompiledQuery.Compile有什么问题?!?
更新:我知道OrderBy不能工作(因为它不是@p参数)。我仍然想弄清楚为什么CompiledQuery.Compile不适用于我的扩展方法。互联网上的信息几乎不存在。
我不明白为什么这是社区wiki。 – JustLoren 2009-11-05 18:17:32