当前位置:  开发笔记 > 编程语言 > 正文

在Linq Select方法中避免重复代码

如何解决《在LinqSelect方法中避免重复代码》经验,为你挑选了1个好方法。

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

我用简单的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并且显然失败了.

如何以一种优雅的方式解决这个问题,而不重复"选择"代码?



1> Jon Skeet..:

我用的是:

Expression> conversion = result => { ... };

第一种情况:

var result = queryable.Select(conversion);

第二种情况:

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

基本上使用这样一个事实,即你可以一起执行两个投影,这样你的第一个投影(在第二种情况下)会让你进入你已经解决的情况.


@HamletHakobyan:那不会编译...`conversion`只是一个表达式树,不能被调用.您不希望将其编译为委托,因为此时EF无法将其转换为SQL.
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有