【问题标题】:Refactor select part of Linq expression?重构Linq表达式的选择部分?
【发布时间】:2008-12-17 20:30:14
【问题描述】:

我正在玩一些 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 };

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

【问题讨论】:

    标签: .net linq linq-to-sql


    【解决方案1】:

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

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

    【讨论】:

    • 我想我真正的问题是,SomeMethod() 的语法是什么?
    • SomeMethodThatReturnsEtc 的返回类型是什么?
    【解决方案2】:

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

    你想要的方式,你只能从方法中返回“对象”。

    【讨论】:

      【解决方案3】:

      您将需要动态构建一个小的投影(选择)表达式来附加到您的过滤基本查询。 有关示例,请参阅以下内容之一:

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

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

      【讨论】:

        【解决方案4】:

        你不能从函数返回匿名类型,所以你会被声明的类型困住,这与你的问题不符,或者对象,这不会很有帮助。

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

        【讨论】:

          【解决方案5】:

          有时最简单的做法就是创建一个带有一堆公共 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 .... }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-11-29
            • 1970-01-01
            • 1970-01-01
            • 2018-02-20
            • 2014-07-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多