针对成员对象列表

时间:2016-07-21 22:04:22

标签: c# entity-framework linq

我有一个应用程序,我继承自跟踪反馈卡的同事。我还有一个表单,可以根据用户输入的多个过滤器过滤网页上显示的卡片。所有过滤器都可以正常工作,除了针对反馈细节应用的过滤器(服务很好/坏,房间干净/脏,等等)。这些存储在我的卡类中的成员类列表中。

以下是每个班级的一组片段。

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种可能的响应,这可能不适用于所有情况,所以我需要查看所有关于特定情况(清洁度等)的卡片,无论它们是正面还是负面。这就是这个过滤器的目的。

4 个答案:

答案 0 :(得分:2)

var ifExist = YourList.Any(lambda expression)检查YourList<T>是否包含对象whif fulifill lambda表达式。它只返回truefalse。如果您想拥有对象列表,请使用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,它就运行良好。