当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > Cast的妙用:泛用LINQ 語句

ASP.NET
asp.net css注释的影响
ASP.NET与数据库相关技巧
关于HtmlForm控件
三色交替的下拉列表框
精通ASP.NET中弹出窗口技术
ASP.NET Forums与现有系统整合方案示例
ASP.NET操作IIS中的虚拟目录
DataGrid与SQL Server 2000数据绑定
如何让Web应用程序在Client端实现导出报表功能
如何保证web app中的Send Email线程稳定性
关于用ASP.Net识别远程主机服务器种类
ASP.NET中上传下载文件
提高ASP.NET性能的方法
asp.net StreamReader 创建文件
asp.net如何生成图片验证码(简单)
一个.net 压缩位图至JPEG的代码
简单的SQL Server数据库数据读取与数据操作
获取网站的RSS聚合到自己的网页
.Net程序中整站通用的防SQL注入函数
asp.net生成缩略图及给原始图加水印的函数

ASP.NET 中的 Cast的妙用:泛用LINQ 語句


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 59 ::
收藏到网摘: n/a

什么是泛用LINQ 语句

泛用LINQ语句的概念很简单,在一些情况下,我们会有需求使用同一段程式码来对不同资料表做查询,这在ADO.NET中很容易达到,见下例:

此函式接受一个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应用手法。