[英]Multiple Select using LINQ
我有這樣的 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; }
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
,就可以了。 但是,如果您確實需要執行其中任何一項操作,則必須為此創建一個類(或結構)(或者,您可以以犧牲類型推斷/智能感知為代價來使用object
)。
另請注意,您不必一個接一個地鏈接Where
,您可以簡單地使用像&&
這樣的布爾運算符來分隔您的條件。
編輯:如果您的模型完全由這三個屬性組成,則您根本不需要Select
。 你可以簡單地這樣做:
var result = context.InvitationMails
.Where(c => c.LinkStart == null && c.LinkEnd == null && c.Link == null);
請注意,在這種情況下, result
將不是匿名類型的IQueryable
,而是InvitationMail
(考慮到您的模型名稱是InvitationMail
)。
由於您嘗試選擇的屬性並非都屬於同一類型,因此如果要將它們全部保留在同一個IEnumerable
,則需要創建一個struct
。 IEnumerable<pair<string, pair<DateTime?, DateTime?>>>
也可以使用,但 struct 解決方案似乎更清晰。
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.