我有一个应用程序,我继承自跟踪反馈卡的同事。我还有一个表单,可以根据用户输入的多个过滤器过滤网页上显示的卡片。所有过滤器都可以正常工作,除了针对反馈细节应用的过滤器(服务很好/坏,房间干净/脏,等等)。这些存储在我的卡类中的成员类列表中。
以下是每个班级的一组片段。
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种可能的响应,这可能不适用于所有情况,所以我需要查看所有关于特定情况(清洁度等)的卡片,无论它们是正面还是负面。这就是这个过滤器的目的。
答案 0 :(得分:2)
var ifExist = YourList.Any(lambda expression)
检查YourList<T>
是否包含对象whif fulifill lambda表达式。它只返回true
或false
。如果您想拥有对象列表,请使用var YourNewList = YourList.Where(lambda expression).ToList()
。
答案 1 :(得分:1)
试试这个。虽然我不完全确定您的过滤器对象。
{{1}}
答案 2 :(得分:0)
您不能使用all语句,如果所有值都与id相同,则此语句的谓词是。
在你的where语句中,这是一个过滤子句,你不过滤任何东西。
您是否正在将反馈值与ID进行比较?它们是一样的吗? 你能发布一些关于
的更多细节吗?也许试试:
cardQuery = cardQuery.Where(card => filter. FeedbackDetails.Contains(card. Id/detsils))
.Select(se=> se).Tolist() ;
答案 3 :(得分:0)
我能够解决这个问题。发布的所有答案都帮助我朝着正确的方向前进。我希望我可以将它们全部标记为答案。
我最后稍微修改了反馈模型,以包含数据库中的另一个身份字段。它重复了现有的日期(糟糕的设计,我知道。这不是我的),但有一个独特的名称。使用新字段,我可以应用Any过滤器。我想我将LINQ与名为ID的多个字段混淆。一旦我使用了FeedbackID,它就运行良好。