简体   繁体   English

在ASP.NET Web API 2上使用Linq筛选IEnumerable Collection

[英]Filter IEnumerable Collection using Linq on ASP.NET Web API 2

I need to filter my data based on a Boolean condition using Linq on ASP.NET Web Api 2 C#. 我需要在ASP.NET Web Api 2 C#上使用Linq基于布尔条件过滤数据。 But my JSON data returns null when I try filtering the data. 但是,当我尝试过滤数据时,我的JSON数据返回null。

The data is a List of Invites, I want to filter the results based on a MemberID and if the user is attending(IsAttending) 数据是邀请列表,我想基于MemberID过滤结果,如果用户正在参加(IsAttending)

Here is the Member Model 这是会员模型

public class Member
{
    public int MemberID { get; set; }
    public string MemberName { get; set; }
    public bool IsAdmin { get; set; }
    public bool IsAttending { get; set; }
    public int MemberNumber { get; set; }
    public string PhoneNumber { get; set; }
    public int InviteID { get; set; }
    [JsonIgnore]
    public virtual Invite Iinvite { get; set; }
}

InviteModel 邀请模型

public class Invite
{
    public int InviteID { get; set; }
    public string Subject { get; set; }
    public string DateTime { get; set; }
    public virtual List<Member> Members { get; set; }
}

Original JSON data without filtering 未经过滤的原始JSON数据

[{
    "InviteID": 1,
    "Subject": "Hell",
    "DateTime": "March 2017",
    "Members": [{
        "MemberID": 1,
        "MemberName": "roger",
        "IsAdmin": false,
        "IsAttending": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 1
    },
    {
        "MemberID": 2,
        "MemberName": "nkosi",
        "IsAdmin": false,
        "IsAttending": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 1
    },
    {
        "MemberID": 3,
        "MemberName": "Mphile",
        "IsAdmin": false,
        "IsAttending": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 1
    }]
},
{
    "InviteID": 2,
    "Subject": "Hell",
    "DateTime": "March 2018",
    "Members": [{
        "MemberID": 4,
        "MemberName": "roger",
        "IsAdmin": false,
        "IsAttending": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 2
    },
    {
        "MemberID": 5,
        "MemberName": "nkosi",
        "IsAdmin": false,
        "IsAttending": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 2
    },
    {
        "MemberID": 6,
        "MemberName": "Mphile",
        "IsAdmin": false,
        "IsAttending": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 2
    }]
},
{
    "InviteID": 3,
    "Subject": "Hell",
    "DateTime": "Marchs 2017",
    "Members": [{
        "MemberID": 7,
        "MemberName": "Roger Nkosi",
        "IsAdmin": false,
        "IsAttending": true,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 3
    },
    {
        "MemberID": 8,
        "MemberName": "nkosi",
        "IsAdmin": false,
        "IsAttending": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 3
    },
    {
        "MemberID": 9,
        "MemberName": "Mphile",
        "IsAdmin": false,
        "IsAttending": false,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 3
    }]
},
{
    "InviteID": 4,
    "Subject": "Hell",
    "DateTime": "Marchs 2017",
    "Members": [{
        "MemberID": 10,
        "MemberName": "Roger Nkosi",
        "IsAdmin": false,
        "IsAttending": true,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 4
    },
    {
        "MemberID": 11,
        "MemberName": "nkosi",
        "IsAdmin": false,
        "IsAttending": true,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 4
    },
    {
        "MemberID": 12,
        "MemberName": "Mphile",
        "IsAdmin": false,
        "IsAttending": true,
        "MemberNumber": 0,
        "PhoneNumber": null,
        "InviteID": 4
    }]
}]

Here is how I filter and return the data 这是我过滤并返回数据的方法

return db.invites.Include("members").ToList()
                .Where(x => x.Members == db.members
                                .Where(xx => xx.IsAttending == true && xx.MemberID == 4)).ToList();

What you want is not impossible, is just not achievable with a single LINQ query to the DB. 您想要的不是不可能的,只是对数据库执行单个LINQ查询是无法实现的。

Assuming memberId contains the id of the member you want to filter on: 假设memberId包含您要过滤的成员的ID:

var invites = db.invites.Include(i => i.Members).Where(i => i.Members.Any(m => m.IsAttending && m.MemberID == memberId)).ToList(); // db query
invites = invites.Select(i =>
    new Invite
    {
        DateTime = i.DateTime,
        InviteID = i.InviteID,
        Subject = i.Subject,
        Members = i.Members.Where(m => m.IsAttending && m.MemberID == memberId).ToList()
    }).ToList(); // this removes other members (in memory)

 return invites;

You should use the Linq Any() operator. 您应该使用Linq Any()运算符。

It will look something more like 看起来会更像

return db.invites.Include("members").Where(x => x.Members.Any(xx => xx.IsAttending && xx.MemberID == 4).ToList()

By the way, I removed the ToList() after db.invites because that will cause the entire members collection to enumerate. 顺便说一下,我在db.invites之后删除了ToList(),因为这将导致整个成员集合枚举。 Not sure how big your database is, but that would eventually be a problem. 不确定数据库的大小,但这最终将是一个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM