我有像这样的LINQ查询
ApplicationDbContext context = new ApplicationDbContext();
IEnumerable<InvitationMails> customers = context.InvitationMails
.Where(c => c.LinkStart == null)
.AsEnumerable()
.Select(c => {
c.LinkStart = start;
return c;
});
我需要选择LinkStart
,LinkEnd
和Link
列,并检查这样的空值。
.Where(c => c.LinkStart == null)
.Where(c => c.LinkEnd == null)
.Where(c => c.Link == null)
但如何编写查询select?
模型
public string Link { get; set; }
public DateTime? LinkStart { get; set; }
public DateTime? LinkEnd { get; set; }
答案 0 :(得分:1)
LINQ允许您选择所需的任何属性组合,而必须为每个选择组合定义类型。如果未在Select
中指定类型,则您的选择变形成为匿名对象。这就是你如何做到的:
var result = context.InvitationMails
.Where(c => c.LinkStart == null && c.LinkEnd == null && c.Link == null)
.Select(c => new { c.LinkStart, c.LinkEnd, c.Link });
result
是一个带有指定列的匿名对象。
请注意,只要您不需要将result
对象传递给任何方法,或者从当前方法返回result
,您就可以了。但是,如果您确实需要执行任何操作,则必须为此创建一个类(或结构)。
另请注意,您不必逐个链接Where
,只需使用&&
之类的布尔运算符来区分条件。
编辑:如果您的模型完全由这三个属性组成,则根本不需要Select
。你可以这样做:
var result = context.InvitationMails
.Where(c => c.LinkStart == null && c.LinkEnd == null && c.Link == null);
请注意,在这种情况下,result
不是IQueryable
匿名类型,而是InvitationMails
(考虑到您的模型名称为InvitationMails
)。
答案 1 :(得分:0)
由于您尝试选择的属性并非都是同一类型,因此如果您希望将它们全部保存在同一struct
中,则需要创建IEnumerable
。 IEnumerable<pair<string, pair<DateTime?, DateTime?>>>
也可以,但结构解决方案似乎更清晰。
public struct Customer
{
string Link;
DateTime? LinkStart;
DateTime? LinkEnd;
public Customer(string link, DateTime? linkStart, DateTime? linkEnd)
{
this.Link = link
this.LinkStart = linkStart;
this.LinkEnd = linkEnd;
}
}
如果你有,那么你可以这样做:
.Where(c => c.LinkStart == null)
.Where(c => c.LinkEnd == null)
.Where(c => c.Link == null)
.Select(c => new Customer(c.Link, c.LinkStart, c.LinkEnd));