[英]LINQ 'query syntax' — where clause filtering against List of int
[英]Filtering LINQ Query against member object list
我有一个应用程序,我继承自跟踪反馈卡的同事。 我还有一个表单,可以根据用户输入的多个过滤器过滤网页上显示的卡片。 所有过滤器都可以正常工作,除了针对反馈细节应用的过滤器(服务很好/坏,房间干净/脏,等等)。 这些存储在我的卡类中的成员类列表中。
下面是每个类的一组片段。
public class Card {
public long ID { get; set; }
public List<Feedback> feedback { get; set; }
...
}
public class Feedback {
public long ID {get; set; }
...
}
public class CardFilter {
public ICollection<long> FeedBackDetails {get; set; }
...
}
...
public IQueryable<CardType > GetFeedbackQueryable<CardType>(CardFilter filter = null)
where CardType : Card
{
var data = Service.GetRepository<CardType>();
var CardQuery = data.All;
...
if (filter.FeedbackDetails != null && filter.FeedbackDetails.Count != 0)
{
cardQuery = cardQuery.Where(card => card.FeedbackValues)
.All(fbv => filter.FeedbackDetails.Contains(fbv.ID));
}
return cardQuery;
}
...
当我尝试过滤器时:
cardQuery = cardQuery.Where(card => card.FeedbackValues)
.All(fbv => filter.FeedbackDetails.Contains(fbv.ID));
它返回15个卡实例,没有任何反馈。 如果我使用过滤器:
cardQuery = cardQuery.Where(card => card.FeedbackValues)
.Any(fbv => filter.FeedbackDetails.Contains(fbv.ID));
即使我可以查看数据并查看相应的卡片,也不会返回任何内容。
我是LINQ的新手,所以我知道我错过了一些东西。 请指出我在正确的方向。
编辑:
为了给出这个应用程序的更多背景知识,我会更加冗长。 卡表/模型包含有关卡和提交卡的人的信息。 我的意思是姓名或匿名,地址,评论的位置和一些其他基本事实。 反馈项列在另一个表中并显示在Web表单上,用户可以检查每个表的正面或负面。 每个反馈细节有三种可能的答案; 0(正),1(负)或无(无答案)。
卡模型具有所有基本卡信息以及一组反馈响应。 我给你带来麻烦的过滤器反对那些回复。 每张卡片可能有0到52种可能的响应,这可能不适用于所有情况,所以我需要查看所有关于特定情况(清洁度等)的卡片,无论它们是正面还是负面。 这就是这个过滤器的目的。
var ifExist = YourList.Any(lambda expression)
检查YourList<T>
包含对象whif fulifill lambda表达式。 它只会返回true
或false
。 如果你想拥有对象列表,你应该使用var YourNewList = YourList.Where(lambda expression).ToList()
。
试试这个。 虽然我不完全确定你的过滤器obj。
cardQuery = cardQuery.Query().Select(card => card.FeedbackValues).Where(fbv => filter.FeedbackDetails.Contains(fbv.ID));
您不能使用all语句,如果所有值都与id相同,则此语句的谓词。
在你的where语句中,这是一个过滤子句,你不过滤任何东西。
你正在将反馈值与id进行比较? 它们是一样的吗? 你能发布更多细节吗?
也许试试:
cardQuery = cardQuery.Where(card => filter. FeedbackDetails.Contains(card. Id/detsils))
.Select(se=> se).Tolist() ;
我能够解决这个问题。 发布的所有答案都帮助我朝着正确的方向前进。 我希望我能把所有人都标记为答案。
我最后重新修改了我的反馈模型,以包含数据库中的另一个身份字段。 它重复了现有的日期(糟糕的设计,我知道。这不是我的),但有一个独特的名称。 使用新字段,我可以应用Any过滤器。 我想我将LINQ与名为ID的多个字段混淆。 一旦我使用FeedbackID,它工作正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.