我有一个方法,我执行查询SQL(我使用Linq to SQL,但我必须执行经典的SQL查询),但我不知道将从哪个表/实体生成此查询。< / p>
所以,我在想,因为我不知道从哪个表中生成查询,我不知道我的IQueryable的类型,我是对的吗?
但我不知道如何归还IQueryable
?我试图返回<T>
,但它无效。
谢谢!
答案 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类型)是创建自己的类型(即..类或结构)并填充一个列表并返回...我猜你已经知道你要返回的列,所以它不应该太难。
希望这会有所帮助 标签