我想获取表中单个列的值数组,例如,我有一个名为Customer(ID,Name)的表,并且想要获取所有客户的ID。我在LINQ中的查询是:
var ids = db.Customers.Select(c=>c.ID).ToList();
此查询的答案是正确的,但我运行了SQL Server Profiler,并看到了如下所示的查询:
SELECT [t0].[ID], [t0].[Name] FROM [dbo].[Customer] AS [t0]
我知道LINQ会选择所有列,然后创建ID字段的整数数组。
如何编写在SQL Server中生成此查询的LINQ查询:
SELECT [t0].[ID] FROM [dbo].[Customer] AS [t0]
谢谢。
更新:我有一个执行此操作的功能,此功能会导致该结果:
public static List<TResult> GetSingleColumn<T, TResult>(Func<T, bool> predicate, Func<T, TResult> select) where T : class
{
using (var db = new DBModelDataContext())
{
var q = db.GetTable<T>().AsQueryable();
if (predicate != null)
q = q.Where(predicate).AsQueryable();
return q.Select(select).ToList();
}
}
并像这样使用它:
var ids = DBMH.GetSingleColumn<Customer, int>(null, c => c.ID);
答案 0 :(得分:4)
如果只选择所需的字段,则会缩小生成的SQL查询的范围。试试这个:
var ids = from customer in db.Customers
select customer.ID;
答案 1 :(得分:2)
public static List<TResult> GetSingleColumn<T, TResult>(
Expression<Func<T, bool>> predicate,
Expression<Func<T, TResult>> select) where T : class
{
using (var db = GetData())
{
var q = db.GetTable<T>().AsQueryable();
if (predicate != null)
q = q.Where(predicate).AsQueryable();
var q2 = q.Select(select);
return q2.ToList();
}
}
这就是你应该做的事。
答案 2 :(得分:1)
Fix'd!
public static List<TResult> GetSingleColumn<T, TResult>
(
Expression<Func<T, bool>> predicate,
Expression<Func<T, TResult>> select) where T : class
{
由于您使用了Func
个实例而不是Expression
个实例,因此您使用的是Enumerable.Where
和Enumerable.Select
,而不是Queryable.Where
和Queryable.Select
。这导致本地解析而不是数据库端
分辨率。