在Linq Select方法

时间:2016-01-07 07:50:31

标签: c# entity-framework linq

我有一些愚蠢的情况,我无法找到解决烦人问题的简单而优雅的解决方案。

我用简单的UI编写asp.net应用程序,根据用户选择查询数据库。用于使用Entity Framework查询DB I.

在我的场景中,可选用户选项之一是自由文本,为此我使用SQL Server FTS功能(使用CONTAINSTABLE功能,因为我需要按顺序排序结果相关性)。

现在,我有以下情况:

如果用户没有提供免费文字条件,我会创建类型为IQueriable<Result>的结果的简单Linq查询(其中&#39;结果&#39;是包含来自表的数据的实体)

但是,如果用户 提供了免费文字条件,我使用CONTAINSTABLE创建查询,其类型为IQueriable<ResultWithRank>(其中&#39; ResultWithRank&#39;是一个对象包含两个实体:&#39;结果&#39;&#39; Rank&#39;,因为CONTAINSTABLE导致内部联接。)

在这个阶段,在我构建了我的查询后,我需要执行&#39;选择&#39;方法,以便将其转换为有用的东西。

问题在于:

在第一种情况下,我的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 .. */

我想避免重复&#34;选择&#34;代码,因为两种情况都相同。我试图将它移动到外部方法,但是由于Linq试图将我的方法转换为SQL并且显然失败了,因此无法执行。

如何以优雅的方式解决此问题,而无需重复选择&#39;码?

1 个答案:

答案 0 :(得分:7)

我会用:

Expression<Func<Result, Foo>> conversion = result => { ... };

第一种情况:

var result = queryable.Select(conversion);

第二种情况:

var result = queryable.Select(entity => entity.Result)
                      .Select(conversion);

基本上使用这样一个事实,即您可以一起执行两个投影,这样您的第一个投影(在第二种情况下)就会让您进入已经处理过的情况。