有人可以帮忙吗?
我有一个嵌入在扩展方法中的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'
答案 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;