C# 根据成员对象列表筛选LINQ查询
我从一位同事那里继承了一个跟踪反馈卡的应用程序。我还有一个表单,可以根据用户输入的过滤器对网页上显示的卡片进行过滤。所有过滤器工作正常,但根据反馈细节应用的过滤器除外(服务良好/不好,房间干净/脏等)。它们存储在my card类的成员类列表中 下面是每个类的一组代码片段C# 根据成员对象列表筛选LINQ查询,c#,entity-framework,linq,C#,Entity Framework,Linq,我从一位同事那里继承了一个跟踪反馈卡的应用程序。我还有一个表单,可以根据用户输入的过滤器对网页上显示的卡片进行过滤。所有过滤器工作正常,但根据反馈细节应用的过滤器除外(服务良好/不好,房间干净/脏等)。它们存储在my card类的成员类列表中 下面是每个类的一组代码片段 public class Card { public long ID { get; set; } public List<Feedback> feedback { get; set; } .
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;
}
...
它返回15个卡实例,没有任何反馈。如果我使用过滤器:
cardQuery = cardQuery.Where(card => card.FeedbackValues)
.All(fbv => filter.FeedbackDetails.Contains(fbv.ID));
cardQuery = cardQuery.Where(card => card.FeedbackValues)
.Any(fbv => filter.FeedbackDetails.Contains(fbv.ID));
没有返回任何内容,即使我可以查看数据并查看相应的卡片
我是LINQ的新手,所以我知道我错过了一些东西。请给我指一下这里的正确方向
编辑:
为了对这个应用程序提供更多的背景知识,我将更加详细。卡片表/模型包含有关卡片和提交人的信息。我指的是姓名或匿名者、地址、被评论的地点和其他一些基本事实。反馈项目列在另一个表中,并显示在web表单上,用户可以检查每个项目的积极或消极。每个反馈细节有三个可能的答案;0(肯定)、1(否定)或零(无答案)
卡片模型包含所有基本卡片信息以及一系列反馈响应。给我带来麻烦的过滤器是针对这些响应的集合。每张卡可能有0到52个可能的响应,这些响应可能不适用于所有情况,因此我需要查看与特定情况(清洁度等)相关的所有卡,无论它们是正面的还是负面的。这就是此筛选器的用途。您不能使用all语句,此语句的谓词是如果所有值都与id相同 在where语句(一个过滤子句)中,您没有过滤任何东西 您正在将反馈值与id进行比较?它们是一样的吗? 你能发布更多关于这个的细节吗 也许可以试试:
cardQuery = cardQuery.Where(card => filter. FeedbackDetails.Contains(card. Id/detsils))
.Select(se=> se).Tolist() ;
试试这个。虽然我不能完全确定你的过滤器obj
cardQuery = cardQuery.Query().Select(card => card.FeedbackValues).Where(fbv => filter.FeedbackDetails.Contains(fbv.ID));
var ifExist=YourList.Any(lambda表达式)
检查YourList
是否包含fulifill lambda表达式的对象。它只返回true
或false
。如果您想拥有对象列表,应该使用var YourNewList=YourList.Where(lambda表达式).ToList()
我能够解决这个问题。张贴的所有答案都帮我找到了正确的方向。我真希望我能把它们都标记为答案
最后,我稍微修改了我的反馈模型,以包含数据库中的另一个标识字段。它重复了现有的日期(我知道设计不好,不是我的),但有一个唯一的名字。使用新字段,我可以应用任意过滤器。我想我把LINQ和多个名为ID的字段混淆了。一旦我使用了FeedbackID,它就工作得很好。你到底想用这个查询得到什么?我认为你的第二个查询更接近你要查找的内容(即使括号就在前面。不应该有任何查询)。这是说“给我所有的卡片,其中至少有一个反馈值的ID包含在过滤器的反馈详细信息中”。这就是你要做的吗?这是用
All
编译的吗?IQueryable
是否为提供不同的签名?因为它应该返回一个bool
,并且不能被分配到cardQuery
。如果FeedBackDetails
只包含0
或1
,它们如何与Feedback.ID
匹配?我省略了一个重要的句子。很抱歉反馈值模型由反馈详细信息ID、值、提交时的显示名称和提交日期组成。查看回答此评论的模型,我意识到可能是我的筛选器使用了错误的ID字段。在我的示例中,我尝试仅根据反馈详细信息进行筛选。可以完成的反馈详细信息位于数据库表中,因此它们将始终具有ID和相应的卡。因为反馈详细信息是card类中的一个列表,所以我不能这样做:cardQuery=cardQuery.Where(card=>filter.FeedbackDetails.Contains(card.FeedbackValues.ID))。。。我需要在where中使用另一个函数来访问ID。在select上没有可以使用的Query()方法。我确实尝试过cardQuery.Select(card=>card.FeedBackValues).Where(fbv=>filter.FeedbackDetails.Contains(fbv.ID));但是我得到的错误是System.Collections.Generic.ICollection'不包含'ID'的定义,并且找不到接受'System.Collections.Generic.ICollection'类型的第一个参数的扩展方法'ID'(是否缺少using指令或程序集引用?)。哎呀,将Query()
语句放错了位置。哈哈,顺便问一下,你的问题已经解决了吗?