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

时间:2009-05-11 16:51:50

标签: linq-to-sql iqueryable

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

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

但我不知道如何归还IQueryable?我试图返回<T>,但它无效。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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#中调用它时,你可以不使用<T>,因为类型推断可以在编译时找出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-to-SQL,或者这只是LINQ-to-Objects,它并不在乎。

答案 1 :(得分:0)

你不能发现。由于您不知道类型,因此无法返回通用Generic(即.List)唯一的其他选项(您也可以随时返回强Linq的子集到Sql类型)是创建自己的类型(即..类或结构)并填充一个列表并返回...我猜你已经知道你要返回的列,所以它不应该太难。

希望这会有所帮助 标签