簡體   English   中英

在 LINQ select 中為特定列使用新語句

[英]Using where in LINQ select new statement for specific columns

我正在處理 class 分配,並在 LINQ 中迷失了一點。

我有 3 個表,“oltandok”包含人員的數據,“preferenciak”包含該人的首選疫苗,包含 3 列:

  • 表 oltandok 的 FK
  • 表示偏好順序的數字(1 最高,6 最低優先)
  • 另一個表的 FK,其中包含名為“vakcinak”的疫苗數據

我想通過以下方式在 DataGridView 中顯示數據:個人數據和不同列中的首選疫苗:

  • Pref1 - pref == 1 的疫苗名稱
  • Pref2 - pref == 2 的疫苗名稱
  • 等等

這是我使用代碼的地方,但我不確定如何正確設置 select 首選項。

manu_rogz.DataSource = ( from x in context.oltandok
                         join y in context.preferencia on x.TAJ equals y.oltandok_FK
                         select new
                         {
                             TAJ = x.TAJ,
                             Nev = x.nev,
                             Szuletesnap = x.birthdate,
                             Pref1 = ???
                             Pref2 = ???
                         }
                       ).ToList();

因為preferenciak表每人包含多行,所以您需要執行一些分組。

這是一些非常粗略的代碼,它說明了一種方法。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var persons = new List<Person> { new Person { ID = 11, PersonName = "Alice" }, new Person { ID = 22, PersonName = "Bob" } };
        var vaccines = new List<Vaccine> { new Vaccine(){ ID = 111, VaccineName= "Pfizer" }, new Vaccine(){ ID = 222, VaccineName = "Moderna" } };
        var preferences = new List<VaccPref>
                              {
                                  new VaccPref() { Person_FK = 11, Preference = 1, Vaccine_FK = 111 },
                                  new VaccPref() { Person_FK = 11, Preference = 2, Vaccine_FK = 222 },
                                  new VaccPref() { Person_FK = 22, Preference = 1, Vaccine_FK = 222 },
                                  new VaccPref() { Person_FK = 22, Preference = 2, Vaccine_FK = 111 }
                              };

        var prefsWithVaccNames = preferences.Join(vaccines, p => p.Vaccine_FK, v => v.ID, (pref, vaccine) => new Tuple<VaccPref, string>(pref, vaccine.VaccineName));

        var groupedPrefs = prefsWithVaccNames.GroupBy(p => p.Item1.Person_FK);

        var personPrefs = new List<PersonPrefs>();
        foreach (var group in groupedPrefs)
        {
            personPrefs.Add(
                new PersonPrefs()
                    {
                        Person_FK = group.Key,
                        Pref1 = group.Single(v => v.Item1.Preference == 1).Item2,
                        Pref2 = group.Single(v => v.Item1.Preference == 2).Item2,
                    });
        }

        var personPrefsWithPersonNames =
            personPrefs.Join(
                persons,
                pp => pp.Person_FK,
                p => p.ID,
                (pp, p) => new NamedPersonPrefs() { Name = p.PersonName, Pref1 = pp.Pref1, Pref2 = pp.Pref2 }).ToArray();

    }
}

class Person
{
    public int ID { get; set; }
    public string PersonName { get; set; }
}

class VaccPref
{
    public int Person_FK { get; set; }
    public int Preference { get; set; }
    public int Vaccine_FK { get; set; }
}

 class Vaccine
{
    public int ID { get; set; }
    public string VaccineName { get; set; }
}
class PersonPrefs
{
    public int Person_FK { get; set; }
    public string Pref1 { get; set; }
    public string Pref2 { get; set; }
}

class NamedPersonPrefs
{
    public string Name { get; set; }
    public string Pref1 { get; set; }
    public string Pref2 { get; set; }
}

這是一個獨立的 C# 程序,它應該產生類似於您所追求的結果。 您當然需要調整 class 定義(並更改表名)以滿足您的需要。

我使用了 LINQ 的流利語法,但如果您願意,也可以使用類似 SQL 的版本。

暫無
暫無

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

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