您的位置:首页 > 编程语言 > C#

LINQ查询表达式(2) - 在 C# 中编写 LINQ 查询

2017-03-09 11:57 337 查看

在 C# 中编写 LINQ 查询

  C# 中编写 LINQ 查询的三种方式:

使用查询语法。

使用方法语法。

组合使用查询语法和方法语法。

      // 查询语法
IEnumerable<int> filteringQuery =
from num in numbers
where num < 3 || num > 7
select num;

      // 方法语法.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);


       //混合语法
int numCount1 =
(from num in numbers1
where num < 3 || num > 7
select num).Count();

// Better: Create a new variable to store
// the method call result
IEnumerable<int> numbersQuery =
from num in numbers1
where num < 3 || num > 7
select num;

int numCount2 = numbersQuery.Count();


  对查询子句的结果使用方法语法。 只需将查询表达式括在括号内,然后应用点运算符并调用此方法。

  通常更好的做法是使用另一个变量(numCount2)来存储方法调用的结果。 这样就不太容易将查询本身与查询结果相混淆。

从方法中返回查询

  任何查询的类型都必须为 IEnumerable 或 IEnumerable<T>,或一种派生类型(如 IQueryable<T>)。 因此,返回查询的方法的任何返回值或 out 参数也必须具有该类型。

  如果某个方法将查询具体化为具体的 List<T> 或 Array 类型,则认为该方法在返回查询结果(而不是查询本身)。 仍然能够编写或修改从方法返回的查询变量。

        // QueryMethhod1 returns a query as its value.
IEnumerable<string> QueryMethod1(ref int[] ints)
{
var intsToStrings = from i in ints
where i > 4
select i.ToString();
return intsToStrings;
}

// QueryMethod2 returns a query as the value of parameter returnQ.
void QueryMethod2(ref int[] ints, out IEnumerable<string> returnQ)
{
var intsToStrings = from i in ints
where i < 4
select i.ToString();
returnQ = intsToStrings;
}


  查询基本上是一组有关如何检索和组织数据的指令。

  若要执行查询,需要调用它的 GetEnumerator 方法。 当您使用 foreach 循环来循环访问元素时,将执行此调用。

  若要计算查询和存储其结果,而不执行 foreach 循环,请对查询变量调用下列方法之一:

ToList<TSource>

ToArray<TSource>

ToDictionary<TSource, TKey, TElement>

ToLookup<TSource, TKey, TElement>

  建议在存储查询结果时,将返回的集合对象分配给一个新变量,如下:

    static List<int> numbers = new List<int>() { 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
static void Main()
{
IEnumerable<int> queryFactorsOfFour =
from num in numbers
where num % 4 == 0
select num;

// Store the results in a new variable
// without executing a foreach loop.
List<int> factorsofFourList = queryFactorsOfFour.ToList();
}


运行时动态指定谓词筛选器

使用 Contains<TSource> 方法:

var queryNames =
from student in students
let i = student.ID.ToString()
where ids.Contains(i)  //ids is method's parameter
select new { student.LastName, student.ID };

foreach (var name in queryNames)
{
Console.WriteLine("{0}: {1}", name.LastName, name.ID);
}


使用 switch 语句进行筛选

    static void QueryByYear(string level)
{
GradeLevel year = (GradeLevel)Convert.ToInt32(level);
IEnumerable<Student> studentQuery = null;
switch (year)
{
case GradeLevel.FirstYear:
studentQuery = from student in students
where student.Year == GradeLevel.FirstYear
select student;
break;
case GradeLevel.SecondYear:
studentQuery = from student in students
where student.Year == GradeLevel.SecondYear
select student;
break;
……

default:
break;
}


参考

  [1]MSDN,在C# 中编写 LINQ 查询
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: