【发布时间】:2010-10-25 08:12:34
【问题描述】:
我有一个执行查询 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 并返回它......我猜你对要返回的列有所了解,所以它应该不会太难。
希望这会有所帮助 标签
【讨论】: