我有一种执行查询 SQL 的方法(我正在使用 Linq to SQL,但我必须执行经典的 SQL 查询),但我不知道将从哪个表/实体生成此查询。
所以,我在想,因为我不知道查询将从哪个表生成,我不知道我的 IQueryable 的类型,对吗?
但我不知道如何退货IQueryable
?我试图返回<T>
,但它不起作用。
谢谢!
我有一种执行查询 SQL 的方法(我正在使用 Linq to SQL,但我必须执行经典的 SQL 查询),但我不知道将从哪个表/实体生成此查询。
所以,我在想,因为我不知道查询将从哪个表生成,我不知道我的 IQueryable 的类型,对吗?
但我不知道如何退货IQueryable
?我试图返回<T>
,但它不起作用。
谢谢!
您可以在内部构建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# 中调用它时,您可以<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 的强大功能。它并不关心您最终是要使用 LINQ-to-SQL 还是只是 LINQ-to-Objects。
你不能像你发现的那样。由于您不知道类型,因此无法返回泛型 Generic(即 List),这是您正在做的唯一其他选择(也可以随时返回强 Linq 到 Sql 类型的子集)是创建自己的类型(即.. Class 或 Struct)并填充 List 并返回...我猜您对要返回的列有所了解,因此应该不会太难。
希望这有助于标签