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

ASP.NET
asp.net(c#)网页跳转七种方法小结
完美解决在ModalPopupExtender中使用CalendarExtender时被层遮挡的问题
ASP.NET、SharePoint中另存文件的长文件名被截断的原因及解决办法
查看Json输出的*最方便*的方法 (转)
asp.net 代码隐藏的编码模型
ajaxpro.dll 控件实现异步刷新页面
asp.net DbProviderFactory的使用-示例
一个简单的asp.net 单点登录实现
jQuery+Ajax用户登录功能的实现
asp.net 弹出对话框返回多个值
.NET 中英文混合验证码实现代码
一个完整的ASP.NET 2.0 URL重写方案[翻译]
asp.net关于onpropertychange和oninput事件实现代码
asp.net gridview指定某一列滚动
Equals和==的区别 公共变量和属性的区别小结
asp.net 合并GridView中某列相同信息的行(单元格)
ASP.NET(C#) 定时执行一段代码
asp.net 预防SQL注入攻击之我见
asp.net下将Excel转成XML档的实现代码
asp.net url分页类代码

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 65 ::
收藏到网摘: 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应用手法。