我正在玩一些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 };
基于内存中的数据(没有做一个巨大的案例陈述),如果可能,我该怎么做?
答案 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
答案 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 .... }