重构选择Linq表达式的一部分?

时间:2008-12-17 20:30:15

标签: .net linq linq-to-sql

我正在玩一些Linq-SQL的东西,做这样的事情:

var foo = from f in db.Foo where f.Bar > 5 select f;

这一切都很好,花花公子,我知道我也可以这样做:

var foo = from f in db.Foo where f.Bar > 5 select new { f.Bar, f.Baz };

我想知道的是,我是否可以将该查询的选择部分分解出来,如果我想在运行时确定要选择哪些Foo部分?如:

var foo = from f in db.Foo where f.Bar > 5 select SomeMethodThatReturnsThePropertiesOfFooIReallyWant();

编辑澄清:我正在寻找SomeMethod ...()的语法和返回类型。

如果我想这样做一次:

select new { f.Bar, f.Baz };

但其他时候这样做:

select new { f.Baz, f.Other };

基于内存中的数据(没有做一个巨大的案例陈述),如果可能,我该怎么做?

5 个答案:

答案 0 :(得分:2)

当然,虽然用流利的语法更容易:

var query_foo = db.Foo.Where(f=>f.Bar >  5);
//  :
var foo =query_foo.Select(f=>SomeMethodThatReturnsEtc(f));

答案 1 :(得分:0)

  

我想我的真正问题是,什么是   SomeMethod()的语法? -   乔纳斯(一小时前)

您想要这样做,只能从方法返回“对象”。

答案 2 :(得分:0)

您需要动态构建一个小的投影(Select)表达式,以适应过滤的基本查询。 有关示例,请参阅以下内容之一:

VS 2008附带的动态查询示例中的Dynamic.cs

http://www.albahari.com/nutshell/predicatebuilder.aspx

答案 3 :(得分:0)

你不能从一个函数中返回匿名类型,所以你会遇到声明的类型,这会违背你的问题,或者对象,这对你来说不会很有帮助。

更重要的是,您对结果的期望是什么?如果成员在编译时实际上是未知的,我不确定你能用它做什么......

答案 4 :(得分:0)

有时最简单的事情就是创建一个带有一堆公共get的简单数据类;并设定;所以你可以选择你的数据到那个班级。如果你正在处理可以在使用数据时非常清楚的可空类型,但是如果它是所有字符串,你可能会在使用数据时找到更清洁的东西。

一个简单的例子

public class MyData {
public string Bar {get;set;}
public int? Baz {get;set;}
public DateTime? {get;set;}
}

var foo = from f in db.Foo where f.Bar > 5 select new MyData { Bar = f.Bar, Foo = f.Foo };

如果您希望将select与select语句放在不同的位置,也可以将语句分离出来,这只会在您尝试枚举时触及服务器。

var foo = from f in db.Foo where f.Bar > 5 select f;
var fooData = f.Select(new MyData .... }