Cast的妙用:泛用LINQ 語句

Cast 的妙用: 泛用 LINQ 語句
/ 黃忠成
什麼是泛用LINQ 語句
泛用LINQ語句的概念很簡單,在一些情況下,我們會有需求使用同一段程式碼來對不同資料表做查詢,這在ADO.NET中很容易達到,見下例:

static void PrintCustomerID(SqlDataReader reader)
{
Console.WriteLine(reader.GetString(reader.GetOrdinal("CustomerID")));
}
此函式接受一個Reader物件,然後頃印CustomerID欄位值,這不受限於SqlDataReader所選取的Schema或是資料表,只要Schema中有CustomerID欄位即可。
不過,這樣的手法在LINQ這種Typed-Query(具型別查詢語句)模式下,並沒有很直覺的寫法,因為你不能寫下下面的句子。

static void Test2(int index)
{
var query;
DataClasses1DataContext context = new DataClasses1DataContext();
context.Log = Console.Out; //for log only,you can remove it.
if (index == 1)
query = context.Customers;
else
query = context.Orders;
var result = from s1 in query where s1.CustomerID.Contains("V")
select s1;
foreach (var item in result)
{
Console.WriteLine(item.CustomerID);
}
}
編譯器會抱怨, var 的變數必須在宣告時指定。
那要如何在 LINQ To SQL 或是 LINQ To Entites 達到同樣的效果呢?這有幾個方法可以做到。

1 、使用 ExecuteQuery ,並使用另一個 Typed 物件來接收回傳集。
2 、使用實體類別 (Entity Class) 繼承。
3 、使用 Cast partial class
1 2 對熟悉 LINQ To SQL 的讀者應該不難,所以我就不再贅述了,第三個手法是較少見的,我們可以運用 partial class 機制,讓 Entity Classes 實作特定介面,然後以 Cast 函式來達到目的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Data.SqlClient;
namespace ConsoleApplication39
{
class Program
{
static void Main(string[] args)
{
Test(1);
Console.WriteLine("------");
Test(0);
Console.ReadLine();
}
static void Test(int index)
{
IQueryable<IGenericBaseClass> query = null;
DataClasses1DataContext context = new DataClasses1DataContext();
context.Log = Console.Out; //for log only,you can remove it.
if(index == 1)
query = context.Customers.Cast<IGenericBaseClass>();
else
query = context.Orders.Cast<IGenericBaseClass>();
var result = from s1 in query where s1.CustomerID.Contains("V") select s1;
foreach (var item in result)
{
Console.WriteLine(item.CustomerID);
}
}
}
public interface IGenericBaseClass
{
string CustomerID { get; set; }
}
partial class Customers : IGenericBaseClass
{
}
partial class Orders : IGenericBaseClass
{
}
}
仔細揣摩上面的程式碼,我相信你會找到一個不一樣的 LINQ 應用手法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值