2010-05-26 60 views
3

我想要獲取表中單個列的值數組,例如,我有一個名爲Customer(ID,Name)的表,並且想要獲取所有客戶的ID。我在LINQ查詢:使用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字段的整數數組。

我如何寫一個LINQ查詢生成的SQL Server的查詢:

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); 

回答

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(); 
    } 
    } 

這是你應該做的方式。

+0

太棒了!多謝,夥計。 – 2013-06-08 09:36:38

4

如果你只選擇你需要的字段它會縮小結果SQL查詢的範圍。試試這個:

var ids = from customer in db.Customers 
      select customer.ID; 
+0

這段代碼是正確的,但我的更新呢? – 2010-05-26 06:50:16

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。這會導致本地解析,而不是數據庫端 分辨率。