2015-08-20 44 views
0

在下面的代碼中,是否有一種方法可以篩選UserDefinedFunctionCollection的成員,因此我不必在循環內執行if (!udf.IsSystemObject)檢查?使用LINQ過濾UserDefinedFunctionCollection?

using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Common; 

private void DebugSqlUserDefinedFunctions(SqlCommand cmd) 
     { 
      Server svr = new Server(new ServerConnection(cmd.Connection)); 
      foreach (Microsoft.SqlServer.Management.Smo.UserDefinedFunction udf in svr.Databases[cmd.Connection.Database].UserDefinedFunctions) 
      { 
       if (!udf.IsSystemObject) 
       { 
        System.Diagnostics.Debug.WriteLine(udf.Name); 
       } 
      } 

     } 

回答

1

這將做到這一點:

private void DebugSqlUserDefinedFunctions(SqlCommand cmd) 
{ 
    Server svr = new Server(new ServerConnection(cmd.Connection)); 
    foreach (var udf in svr.Databases[cmd.Connection.Database].UserDefinedFunctions.Cast<Microsoft.SqlServer.Management.Smo.UserDefinedFunction>().Where(udf => !udf.IsSystemObject)) 
    { 
     System.Diagnostics.Debug.WriteLine(udf.Name); 
    } 
} 

可能會或可能不會要求.Cast <>()

+0

這似乎是它,是在.Cast <>()是必要 - 是因爲集合不是System.Collections.Generic? – tbone

+0

@tbone不完全;這是因爲集合實現了'IEnumerable',而不是'IEnumerable ',因此枚舉集合會產生您需要投射的對象。 – Rob

+1

是的,這就是爲什麼: https://msdn.microsoft.com/en-us/library/vstudio/bb341406(v=vs.100).aspx 中投(IEnumerable的)方法使標準查詢運營商通過提供必要的類型信息在非泛型集合上被調用。例如,ArrayList沒有實現IEnumerable ,但通過在ArrayList對象上調用Cast (IEnumerable),可以使用標準查詢操作符來查詢序列。 – tbone