使用LINQ进行多选

时间:2017-03-11 09:20:47

标签: c# linq

我有像这样的LINQ查询

ApplicationDbContext context = new ApplicationDbContext();

IEnumerable<InvitationMails> customers = context.InvitationMails
            .Where(c => c.LinkStart == null)
            .AsEnumerable()
            .Select(c => {
                c.LinkStart = start;
                return c;
            });

我需要选择LinkStartLinkEndLink列,并检查这样的空值。

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

2 个答案:

答案 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中,则需要创建IEnumerableIEnumerable<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));