我有一些愚蠢的情况,我找不到简单而优雅的解决方案来解决烦人的问题.
我用简单的UI编写asp.net应用程序,根据用户选择查询数据库.用于使用Entity Framework查询DB I.
在我的场景中,其中一个可选用户选择是自由文本,为此我使用SQL Server FTS功能(使用CONTAINSTABLE函数,因为我需要按相关性排序结果).
现在,我有以下情况:
如果用户没有提供自由文本标准,我使用类型的结果创建简单的Linq查询IQueriable
(其中'Result'是一个包含来自表的数据的实体)
但是,如果用户没有提供免费的文字标准,我创建与CONTAINSTABLE查询,它的类型是IQueriable
(其中"ResultWithRank"是一个对象包含两个实体:"结果"和"排名",因为在内部CONTAINSTABLE结果加入).
在这个阶段,在我构建了我的可查询之后,我需要在其上执行'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 .. */
我想避免重复"选择"代码,因为两种情况都相同.我试图将它移动到外部方法,但这没有执行,因为Linq试图将我的方法转换为SQL并且显然失败了.
如何以一种优雅的方式解决这个问题,而不重复"选择"代码?
我用的是:
Expression> conversion = result => { ... };
第一种情况:
var result = queryable.Select(conversion);
第二种情况:
var result = queryable.Select(entity => entity.Result) .Select(conversion);
基本上使用这样一个事实,即你可以一起执行两个投影,这样你的第一个投影(在第二种情况下)会让你进入你已经解决的情况.