使用LINQ查询单个列

时间:2010-05-26 06:15:12

标签: c# linq linq-to-sql

我想获取表中单个列的值数组,例如,我有一个名为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);

3 个答案:

答案 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.WhereEnumerable.Select,而不是Queryable.WhereQueryable.Select。这导致本地解析而不是数据库端 分辨率。