【问题标题】:How can I return a IQueryable in C# 3.0 without knowing its type?如何在不知道其类型的情况下在 C# 3.0 中返回 IQueryable?
【发布时间】:2010-10-25 08:12:34
【问题描述】:

我有一个执行查询 SQL 的方法(我正在使用 Linq to SQL,但我必须执行经典的 SQL 查询),但我不知道该查询将从哪个表/实体生成。

所以,我在想,由于我不知道查询将从哪个表生成,所以我不知道 IQueryable 的类型,对吗?

但是我不知道如何返回这个IQueryable?我尝试返回<T>,但它不起作用。

谢谢!

【问题讨论】:

    标签: linq-to-sql iqueryable


    【解决方案1】:

    您可以在方法中构建IQueryable<T>,然后使该方法成为通用方法。如果您这样做了,那么您将能够直接返回 IQueryable<T>,并且 C# 编译器可以使用类型推断来确定 T 在编译时是什么。这实际上是大多数 Linq 运算符的构建方式,除了它们是作为扩展方法实现的。

    例如,考虑删除列表中该类型默认值的任何方法:

    public static IQueryable<T> FilterDefaults<T>(IQueryable<T> theSet)
    {
        IQueryable<T> query =
            from t in theSet
            where t != default(T)
            select t;
    
        return query;
    }
    

    现在,当您在 C# 中调用它时,您可以省略 &lt;T&gt;,因为类型推断可以在编译时找出 T 仍然是强类型:

    string[] myStrs = { "ABC", null, "", "123", null, "XYZ" };
    var theFilteredStrs = FilterDefaults(myStrs);
    // should represent the sequence: "ABC", "", "123", "XYZ"
    // note null is missing because default(string) is null
    
    int[] myNums = { -1, 0, 3, 0, 42 };
    var theFilteredNums = FilterDefaults(myNums);
    // should represent the sequence: -1, 3, 42
    // note 0 is missing because default(int) is 0
    

    这是一个仅使用基本类型的简单示例,但该想法对于任何 LINQ 用法(包括 LINQ-to-SQL)都是相同的,这是 LINQ 的强大功能。它不关心您最终是要使用 LINQ-to-SQL 还是只是 LINQ-to-Objects。

    【讨论】:

      【解决方案2】:

      你不能像你发现的那样。由于您不知道类型,因此无法返回泛型 Generic(即 List),这是您正在做的唯一其他选择(也可以随时返回强 Linq 到 Sql 类型的子集)是创建自己的类型(即.. Class 或 Struct)并填充一个 List 并返回它......我猜你对要返回​​的列有所了解,所以它应该不会太难。

      希望这会有所帮助 标签

      【讨论】:

        猜你喜欢
        • 2012-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多