2009-11-09 87 views
1

任何人都可以帮忙吗?LINQ:帮助linq查询并包含IEnumerable <string>?

我有一个linq查询嵌入到扩展方法内部,因为v.RentalStatus是一个String。我现在在我原来的查询中使用了一个组(查询非常复杂,所以我不会把它放在这里)。

的重要提示的是,v.RentalStatus = IEnumerable的,因此它可以包含之类的东西

A (meaning active) 
R (meaning rented) 
U (unavailable) 

etc - many more 

我创造什么,我想回去和存储这statusStringList列表,以便例如让我们说该列表包含A和R

这是我的代码从v.RentalStatus只是一个字符串之前,任何人都可以告诉我如何修改此工作。

 var statusStringList = rentalStatus.ToList().ConvertAll<string>(st => st.GetStringValue()); 

     return from v in qry 
       where statusStringList.Contains(v.RentalStatus) 
       select v; 

如果有帮助,这是我的查询的一部分返回RentalStatus - 一组查询它的一部分,但RentalStatus是不是该组由

RentalStatus= g1.Select(j => j.IdRentalStatus).Distinct(), 

G1是我组通过,所以如果你想象有10个“A”,5个“U”......那么它会返回一个A和U的ienumerable ......因为我使用了Distinct。没有10和5我们

我希望我已经很好地解释了,请告诉我,如果我没有

我将不胜感激任何人的帮助..

感谢

编辑

这是我的扩展签名,但并不重要。

public static IQueryable<Rentals> WithStatus(this IQueryable<Rentals> qry, IList<Contants.Statuses> rentalStatus) 
    { 

编辑

正如前面提到的,当v.RentalStatus是它正在一个字符串,但现在它的IEnumerable - 与此

Argument '1': cannot convert from 'System.Collections.Generic.IEnumerable<string>' to 'string' 
+0

你可以修复你的帖子的标题,你忘了E在IEnumerable?谢谢 – 2009-11-09 17:53:02

+0

谢谢MArcel,我已经更新了.. oops – 2009-11-09 17:57:22

回答

2

如果RentalStatus已经从一个字符串变为IEnumberable那么你比较2列表...我想,这应该工作:

return from v in qry 
    where v.RentalStatus.Any(status => statusStringList.Contains(status)) 
    select v; 

这应该给你,有一个状态是在你提供

编辑列表中的任何租金:

是的,我会花一些时间学习lambda表达式。似乎他们正在越来越多地使用,并有充分的理由。下面是教程的几个环节:

An Extensive Examination of LINQ: Lambda Expressions and Anonymous Types

.NET Lambda Expressions – Resources

“WHERE” RentalStatus =包含本身的任何 - arrgghh -

是真的吗?我认为rentalStatuses的列表是您的方法中的一个参数。我想你的查询基本上可以让我得到所有与我指定的列表相匹配的状态的租赁。一个列表位于您的租赁对象上,另一个列表位于您的租赁对象上,另一个列表位于我通过的另一个列表中。

至于为什么我的订单工作。我有一些问题:

你用这个来查询数据库吗?你能看看它生成的tsql吗?

如果是这样,我会看看tsql,看看有什么不同。我将不得不检查我自己。我猜我很幸运。

+0

之间交换,感谢J.13.L,它似乎已经奏效!谢谢。我想知道为什么:-) ...你能解释一下究竟发生了什么吗? ..基本上它说回来“WHERE”RentalStatus =包含任何它本身 - arrgghh - 我很想知道一个很好的解释...你能详细说明吗?我觉得我将在未来使用更多的这些,我可以正常使用lambda表达式,但仍然是新手,这让我有点头了:-) – 2009-11-09 18:21:57

+0

我做了一些更改... – bytebender 2009-11-09 18:59:09

+0

嗨,感谢您的回复,确实RentalStatus是重新从数据库作为Ienumerable ...它很好....再次感谢.. – 2009-11-09 19:02:56

0

我因此集合..它的错误我不知道,但我认为,一个Contains在Linq to SQL工作,它必须是一个数组的字符串(或整数或...),而不是任何IEnumerable。因此,我会尝试:

var statusStringArray = rentalStatus.ToList().ConvertAll<string>(st => st.GetStringValue()).ToArray(); 

return from v in qry 
     where statusStringArray.Contains(v.RentalStatus) 
     select v; 

虽然可能还有其他问题,但我没有看太多。

+0

谢谢,但它工作之前,我应该解释它是错误的v.RentalStatus ..我会更新我的问题,更多的细节.. basicalyl之前v.RentalStatus是一个字符串..它的工作完美,但现在它的字符串集合,即Ienumerable 2009-11-09 17:54:01

+0

问题已更新 – 2009-11-09 17:56:22

1

你可以尝试这样的事:

where statusStringList.Any(x => v.RentalStatus.Contains(x)) 
+0

感谢约翰,试过它,但它返回“本地序列不能用于查询运算符的LINQ到SQL实现除了包含()运算符“。 – 2009-11-09 18:11:04

+1

啊我刚刚注意到J.13.L的答案有效,但区别在于statusStringList和RentalStatus的顺序 - 它们在 – 2009-11-09 18:23:34

0

试试这个:

return from v in qry 
      where rentalStatus.Any(r => r.IdRentalStatus == v.RentalStatus) 
      select v;