.net 3.5 数据库开发 之 LINQ 下

     上一节讲到了LINQ Expression和Extension Method,两个都可以来查询,那到底应该用哪一个呢?

我们都会有所感觉,LINQ Expression使用远比Extension Method方便,所以一般情况下,我们都会使用LINQ Expression,并且这种方式更加清晰,更加易读。既然如此,那有何必使用函数调用呢,有这个问题的出现,主要是因为我们遇到的查询还不复杂,对于比较复杂的查询,用LINQ表达式就会显得力不从心,甚至单纯的LINQ Expression根本无法完成,而Lamda表达式却可以比较好的解决这个问题,所以,至于使用那一种方式,要根据情况来定,最主要的是要熟练掌握这两种方式,这样才能更好的加以运用。

     在这一节中,主要介绍一些常用而容易被忽视的函数:

     对于LINQ来说,很多SQL中所使用的关键字、函数,在LINQ查询中都可以使用,如JOIN、Distinct、MAX、COUNT等,其中join是以关键字的形式出现,像第一个例子中的where、group一样,而Distinct、Count等则是以函数形式出现,值得注意的是,当结果返回多个字段值时,调用Distinct必须编写一个实现IEqualComparer接口的类,并创建该类的对象作为参数传递给Distinct。示例代码如下:

class myCultureComparer : IEqualityComparer
{
    public CaseInsensitiveComparer myComparer;

    public myCultureComparer()
    {
        myComparer = CaseInsensitiveComparer.DefaultInvariant;
    }

    public myCultureComparer(CultureInfo myCulture)
    {
        myComparer = new CaseInsensitiveComparer(myCulture);
    }

    public new bool Equals(object x, object y)
    {
        if (myComparer.Compare(x, y) == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public int GetHashCode(object obj)
    {
        return obj.ToString().ToLower().GetHashCode();
    }
}
Take、TakeWhile、Skip、SkipWhile:Take是取出集合中的前N(参数)条记录,相当于SQL中的SELECT TOP,TakeWhile是根据条件从集合中获取元素,直到条件返回FALSE。相对的,Skip是跳过集合中的前N(参数)个元素,如Skip(5)表示从第6条数据开始取出集合中的元素,同样可以理解SkipWhile的含义。

ToLookup:ToLookup算是另一类的Group技巧,可将对象集中的元素以指定条件分组:如var result = peoples.ToLookup<People, string>(x => x.Name); 表示以Name属性值为键值,对peoples中的元素进行分组,它的返回值集合中的每一个元素不是People类型,而是实现了IGrouping接口的对象。

Union、Intersect、Except:Union可将两个集合中的元素合并,并排除重复的元素,和Union类似的有Concat,Concat将两个集合直接合并,不会排除重复元素。Intersect将获取两个集合的交集,Except将取得补集,如p1.Except(p2)将返回出现在p1中而未出现在p2中的元素。

OfType、Cast:两个都是用来进行类型转换的,不同的是,OfType函数使用as运算,若元素类型无法转换为指定类型,则略过该元素,而Cast是Convert.ChangeType,当无法转换的时候会抛出异常。

let:let语句可以将表达式的结果暂存在一个变量中,交给接下来的表达式处理,示例代码如下:

class LetSample1
{
    static void Main()
    {
        string[] strings =
        {
            "A penny saved is a penny earned.",
            "The early bird catches the worm.",
            "The pen is mightier than the sword." 
        };

        // Split the sentence into an array of words
        // and select those whose first letter is a vowel.
        var earlyBirdQuery =
            from sentence in strings
            let words = sentence.Split(' ')
            from word in words
            let w = word.ToLower()
            where w[0] == 'a' || w[0] == 'e'
                || w[0] == 'i' || w[0] == 'o'
                || w[0] == 'u'
            select word;

        // Execute the query.
        foreach (var v in earlyBirdQuery)
        {
            Console.WriteLine("\"{0}\" starts with a vowel", v);
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    "A" starts with a vowel
    "is" starts with a vowel
    "a" starts with a vowel
    "earned." starts with a vowel
    "early" starts with a vowel
    "is" starts with a vowel
*/

 

.net 3.5 数据库开发 之 LINQ to SQL

 

posted on 2009-03-05 16:31  avenger  阅读(473)  评论(0编辑  收藏  举报

导航