Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免Linq选择方法中的重复代码_C#_Entity Framework_Linq - Fatal编程技术网

C# 避免Linq选择方法中的重复代码

C# 避免Linq选择方法中的重复代码,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一些愚蠢的情况,我找不到简单而优雅的解决恼人问题的方法 我正在编写asp.net应用程序,该应用程序具有简单的UI,用于根据用户选择查询数据库。用于使用实体框架查询DB I 在我的场景中,可选的用户选择之一是自由文本,为此,我使用SQL Server FTS功能(使用函数,因为我需要按相关性排序结果) 现在,我有以下情况: 如果用户没有提供自由文本条件,我将创建简单的Linq查询,查询结果类型为IQueriable(其中“result”是带有表中数据的实体) 但是,如果用户提供了自由文本条件

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

我正在编写asp.net应用程序,该应用程序具有简单的UI,用于根据用户选择查询数据库。用于使用实体框架查询DB I

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

现在,我有以下情况:

如果用户没有提供自由文本条件,我将创建简单的Linq查询,查询结果类型为
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:我试图在选择之后进行选择,这就是我得到的“嵌套查询没有相应的键”。伊利丹:没有,恐怕我从来没见过。