LINQ:帮助linq查询并包含IEnumerable <string>?</string>

时间:2009-11-09 17:40:18

标签: c# linq linq-to-sql lambda

有人可以帮忙吗?

我有一个嵌入在扩展方法中的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的无数......因为我使用的是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'

4 个答案:

答案 0 :(得分: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列表是您方法中的参数。我在想你的查询基本上可以让我获得所有租金,其状态与我指定的任何列表相匹配。一个列表存在于您的Rental对象中,另一个列表是我传递的列表...

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

您是否使用此查询数据库?你能看到它生成的tsql吗?

如果是这样,我会查看tsql,看看有什么区别。我必须检查自己。我猜我很幸运。

答案 1 :(得分:1)

您可以尝试这样的事情:

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

答案 2 :(得分: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;

可能还有其他问题,我看起来并不多。

答案 3 :(得分:0)

试试这个:

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