C# 避免Linq选择方法中的重复代码
我有一些愚蠢的情况,我找不到简单而优雅的解决恼人问题的方法 我正在编写asp.net应用程序,该应用程序具有简单的UI,用于根据用户选择查询数据库。用于使用实体框架查询DB I 在我的场景中,可选的用户选择之一是自由文本,为此,我使用SQL Server FTS功能(使用函数,因为我需要按相关性排序结果) 现在,我有以下情况: 如果用户没有提供自由文本条件,我将创建简单的Linq查询,查询结果类型为C# 避免Linq选择方法中的重复代码,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一些愚蠢的情况,我找不到简单而优雅的解决恼人问题的方法 我正在编写asp.net应用程序,该应用程序具有简单的UI,用于根据用户选择查询数据库。用于使用实体框架查询DB I 在我的场景中,可选的用户选择之一是自由文本,为此,我使用SQL Server FTS功能(使用函数,因为我需要按相关性排序结果) 现在,我有以下情况: 如果用户没有提供自由文本条件,我将创建简单的Linq查询,查询结果类型为IQueriable(其中“result”是带有表中数据的实体) 但是,如果用户提供了自由文本条件
IQueriable
(其中“result”是带有表中数据的实体)
但是,如果用户提供了自由文本条件,我将使用CONTAINSTABLE创建查询,其类型为IQueriable
(其中'ResultWithRank'是一个对象,它包含两个实体:'Result'和'Rank',因为CONTAINSTABLE在内部联接中产生结果)
在这个阶段,在我构建了Queryable之后,我需要对它执行'Select'方法,以便将它转换成有用的东西
问题是:
在第一种情况下,我的select语句如下所示:
var result = queryable.Select(entity => /*.. about 20 lines of reshapying code .. */
var result = queryable.Select(entity.Result => /*.. about 20 lines of exactly the same reshapying code .. */
第二种情况如下所示:
var result = queryable.Select(entity => /*.. about 20 lines of reshapying code .. */
var result = queryable.Select(entity.Result => /*.. about 20 lines of exactly the same reshapying code .. */
我希望避免重复“select”代码,因为这两种情况下都是相同的。我试图将其移动到外部方法,但执行失败,因为Linq试图将我的方法转换为SQL,但显然失败了
如何以优雅的方式解决此问题,而不复制“选择”代码?我会使用:
Expression<Func<Result, Foo>> conversion = result => { ... };
第二种情况:
var result = queryable.Select(entity => entity.Result)
.Select(conversion);
基本上,您可以同时执行两个投影,这样您的第一个投影(在第二种情况下)将使您陷入您已经处理过的情况。是实体和实体。结果是相同的数据类型吗?只是猜测一下:是
。选择(x=>)
和。选择(x=>x.Result)。选择(x=>…)
a选项?您的第二个linq无效。为什么不var result=queryable.Select(entity=>conversion(entity.result))代码>?在性能方面没有区别吗?@HamletHakobyan:那不会编译<代码>转换
只是一个表达式树,不可调用。您不想将其编译为委托,因为此时EF无法将其转换为SQL。@Jon:我试图在选择之后进行选择,这就是我得到的“嵌套查询没有相应的键”。伊利丹:没有,恐怕我从来没见过。