[英]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.