Linq to sql 如何在不知道其类型的情况下返回C#3.0中的IQueryable?

Linq to sql 如何在不知道其类型的情况下返回C#3.0中的IQueryable?,linq-to-sql,iqueryable,Linq To Sql,Iqueryable,我有一个执行查询SQL的方法(我使用LINQtoSQL,但我必须执行一个经典的SQL查询),但我不知道该查询将从哪个表/实体生成 所以,我在想,因为我不知道从哪个表生成查询,所以我不知道IQueryable的类型,对吗 但是我不知道如何返回这个IQueryable?我试图返回,但它不起作用 谢谢 你不能像你发现的那样。由于您不知道类型,因此无法返回泛型(即列表)。您所做的唯一其他选择(也可以在任何时候返回强Linq到Sql类型的子集)是创建您自己的类型(即类或结构),并填写列表并返回。。。我猜你

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

所以,我在想,因为我不知道从哪个表生成查询,所以我不知道IQueryable的类型,对吗

但是我不知道如何返回这个
IQueryable
?我试图返回
,但它不起作用


谢谢

你不能像你发现的那样。由于您不知道类型,因此无法返回泛型(即列表)。您所做的唯一其他选择(也可以在任何时候返回强Linq到Sql类型的子集)是创建您自己的类型(即类或结构),并填写列表并返回。。。我猜你对你要返回的专栏有一些想法,所以应该不会太难

希望这有帮助
Tab

您可以在方法内部构建
IQueryable
,然后使该方法成为泛型方法。如果您这样做了,那么您将能够直接返回
IQueryable
,并且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;
}
这是一个仅使用基本类型的简单示例,但对于任何LINQ使用(包括LINQ到SQL),其思想都是一样的,这是LINQ的强大功能。它不关心最终是使用LINQtoSQL,还是仅仅使用LINQtoObject

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