簡體   English   中英

我將如何編寫此LINQ查詢

[英]How would I write this LINQ query

這是我想要做的:

我有一套記錄。 記錄按年份排序。

Record
{
  string Name {get;set;},
  int Year {get;set;}
  //some other properties
}

我有一套針對每條記錄的規則。 每個規則都有一個類型和一個條件。

Rule
{
  RuleType Type {get;set;},
  Func<Record,bool> Condition {get;set;}
}

對於給定的規則類型,我想遍歷記錄列表並查找第一次滿足規則條件的情況。 我想對所有規則類型執行此操作。

如果我是用SQL編寫的,那么我可能會寫一些東西

SELECT Type, MIN(Year) 
FROM Records, Rules
WHERE Rules.Condition(Records) = TRUE
GROUP BY Type

在LINQ中,我正在努力正確地組合笛卡爾聯接+單個where條件+首次出現+分組。

請協助。

謝謝。

/* Calculate MIN(Year) */
var rule = rules.First(r => r.Type == specificType);
var result = records
    .Where(r => rule.Condition(r))
    .Min(r => r.Year)

/* or just some other rule */

var result = records.FirstOrDefault(r => rule.Condition(r));

您可以使用雙在LINQ查詢語法做一個笛卡爾積from這樣的:

var query= from r in Records
           from rule in Rules
           where rule.Condition(r)
           group new {rule.Type, r.Year } by rule.Type into g
           select g.OrderBy(e=>e.Year).FirstOrDefault();

因此,您有兩個序列。 一系列記錄和一系列規則:

IEnumerable<Record> records = ...
IEnumerable<Rule> rules = ...

您對目標的文字描述與sql語句所建議的有點不同:

對於給定的規則類型,我想遍歷記錄列表並查找第一次滿足規則條件的情況。 我想對所有規則類型執行此操作。

換句話說:對於每個規則,您只想要與該規則匹配的第一條記錄。

您的SQL語句建議您為每個規則都希望有所有符合規則的記錄,按記錄年份排序

您的文字要求。 為此,您的LINQ就像:

IEnumerable<Record> result = Rules.Select(rule =>
    records.Where(record => rule.Condition(record))
    .FirstOrDefault();

換句話說:從規則序列中的每個規則中,獲取記錄序列中的第一條記錄(或默認記錄),其中rule.Condition(record)為true。

這完全是根據您目標的文字描述,但是,從您僅對每條記錄知道的結果記錄序列中,有一條記錄符合該規則的規則。 您不再知道記錄是第一個符合條件的規則。

如果您還想知道該第一條記錄與哪個規則匹配,請記住結果中的規則:

var result = rules.Select(rule => new
    {
        Rule = rule,
        FirstMatchingRecord = records
        .Where(record =>rule.Condition(record))
         .FirstOrDefault(),
     });

從規則集合中的每個規則中選擇規則和與該規則匹配的記錄集合的第一條記錄,然后將它們放到具有Rule和FirstMachingRecord屬性的匿名對象中

請注意,每條第一條匹配的記錄都按照您的記錄收集順序。 您的SQL語句建議您要按升序對記錄進行排序:

IEnumerable<Record> result = Rules.Select(rule =>
    records.Where(record => rule.Condition(record))
    .OrderBy(record => record.Year)
    .FirstOrDefault();

根據記錄的數量和匹配的記錄的數量,最好先對記錄進行排序,然后在where語句中使用排序的結果:

var orderedRecords = records.Orderby(record => record.Year);
IEnumerable<Record> result = Rules.Select(rule =>
    orderedRecords.Where(record=> rule.Condition(record))
    .FirstOrDefault();

您的SQL語句建議您要使用一組規則,其中每個規則都按年份對記錄進行排序。 在linq中:

var result = rules.Select(rule => new
    {
        Rule = rule,
        MatchingRecords = records
            .Where(record => rule.Condition(record))
            .OrderBy(record => record.Year),
    });

對於規則集合中的每個規則,創建一個新的匿名對象,該對象包含該規則以及與該規則匹配的記錄順序,這些記錄按年份升序排列。 從這個結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM