我可以将Linq查询的结果分配给同一查询的源变量吗?

时间:2011-08-24 12:06:49

标签: c# linq

例如,我可以这样做吗?

myList = myList.where(x=>x>10).select(x=>x-10);

其中myListEnumerable<int>

我担心,因为它是一个懒惰的列表,它可能会导致一些问题,例如无限循环。 (在这种情况下可能不会,但在其他情况下会发生吗?)

3 个答案:

答案 0 :(得分:1)

只要将结果转换回基本类型,就可以。如果myList是IEnumerable,则需要将其转换为.AsEnumerable()

myList = myList.where(x=>x>10).select(x=>x-10).AsEnumerable();

答案 1 :(得分:1)

如果您使用类型推理(var),如果您明确声明您的返回类型是底层接口类型,则可能会遇到问题,那么您应该没问题。 Select可以返回IEnumerable或IQueryable(在LINQ 2 SQL / EF的情况下)。因此,如果您按如下方式实例化它,那么您应该没问题:

IEnumerable<int> myList = nums;
myList = myList.Where(x => x > 10).Select(x => x - 10);

这通常在根据用户输入动态添加到查询时使用,如下所示:

IEnumerable<int> myList = nums.OrderBy(x => x);
if (applyFilter)
   myList = myList.Where(x => x > 10).Select(x => x - 10);

请注意,如果在上面的示例中使用var myList = nums实例化myList,则无法编译,因为OrderBy返回IOrderedEnumerable而Where和Select返回IEnumerable,否则会改变myList的类型。

另外要注意的是,如果你让John Oxley建议在IQueryable源上使用.ToEnumerable()(或者我的上面就此而言),它将强制从数据库中获取并且任何后续的查询添加都将是应用客户端。如果你想保持服务器端,请将其声明为IQueryable而不是IEnumerable。

答案 2 :(得分:0)

这条线没问题。右侧将在分配之前进行评估,因此它与x = x + 1无关,其中x只是int