C# 根据成员对象列表筛选LINQ查询

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; } .

我从一位同事那里继承了一个跟踪反馈卡的应用程序。我还有一个表单,可以根据用户输入的过滤器对网页上显示的卡片进行过滤。所有过滤器工作正常,但根据反馈细节应用的过滤器除外(服务良好/不好,房间干净/脏等)。它们存储在my card类的成员类列表中

下面是每个类的一组代码片段

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()
语句放错了位置。哈哈,顺便问一下,你的问题已经解决了吗?