【问题标题】:How to QueryMultiple using linq?如何使用 linq 查询多个?
【发布时间】:2021-03-18 21:07:15
【问题描述】:

如何使用 LINQ 像下面的代码一样进行选择,或者我可以在 LINQ 上使用 QueryMultiple 吗?。我知道如何使用 LINQ 加入两个模型列表,但在这种情况下,我不知道如何使用 LINQ。

var result = con.QueryMultiple(@"select gtp.status, gtp.p_id, gtp.p_name, gtp.p_price,
                      gca.c_type, gbr.bedtype, gtp.currency from t_package as gtp, category as gca,
                      bedrooms as gbr where gtp.c_id = gca.c_id and gtp.bedroom = gbr.bed_id
                      and gtp.p_id = @id;
                      select gtd.tdates_id, gtd.dfrom, gtd.dto from traveldates as gtd
                      where gtd.p_id = @id;
                      select ginc.in_id, ginc.name from inclusion as ginc 
                      where ginc.p_id = @id;
                      select con.con_id, con.name from tcondition as con
                      where con.p_id = @id;
                      select exc.ex_id, exc.name from exclusion as exc 
                      where exc.p_id = @id;
                      select fli.fl_id, fli.name from flightdetails as fli
                      where fli.p_id = @id;
                      select iti.it_id, iti.name, iti.description, iti.bmeal, iti.lmeal, iti.dmeal from itinerary as iti
                      where iti.p_id = @id;
                      select img.img_id, img.slides from imagetable as img
                      where img.p_id = @id;
                      select vi.visa_id, vi.name from visareq as vi
                      where vi.p_id = @id;
                      select ph.ph_id, ph.ph_loc, ph.ph_phtel from photel as ph 
                      where ph.p_id = @id;",
                       new { @id = id });
                var aTp = result.ReadSingle<AdminTP>();
                aTp.adminTDs = result.Read<AdminTD>().ToList();
                aTp.adminINCs = result.Read<AdminINC>().ToList();
                aTp.adminCONs = result.Read<AdminCON>().ToList();
                aTp.adminEXCs = result.Read<AdminEXC>().ToList();
                aTp.adminFLIs = result.Read<AdminFLI>().ToList();
                aTp.adminITIs = result.Read<AdminITI>().ToList();
                aTp.adminIMGs = result.Read<AdminIMG>().ToList();
                aTp.adminVIs = result.Read<AdminVI>().ToList();
                aTp.photels = result.Read<Photel>().ToList();
                return Json(aTp, JsonRequestBehavior.AllowGet);

假设 t_package、traveldates 和其他表是模型列表而不是数据库表。

【问题讨论】:

  • 您是否尝试使用 Entity Framework Core (EF Core)? LINQ 不会直接让您访问数据库。
  • 是的 linq 无法直接访问数据库。这就是为什么让我们假设 db 表作为模型列表或 IList。例如 t_package().Where(x => x.is_id == id).Select(x=>x.Name),现在如何在 linq 中附加另一个选择?因为我对 LINQ 了解不多。
  • 我使用 LINQ 加入了 2 个列表,如下所示 var listGroup = oTDP.GroupJoin(dates, otdp => otdp.p_id, d => d.p_id, (otdp, _dates) => new OTDPView { p_id = otdp.p_id, p_name = otdp.p_name, p_img = otdp.p_img, _Dates = _dates.ToList() });
  • 我不知道是否可以使用类似于或类似于我上面的问题的 LINQ 加入多个子列表?
  • 您在寻找联合(附加)功能还是加入功能?

标签: c# asp.net linq model-view-controller


【解决方案1】:

所以你有 Packages、TravelDates、Gincs、Cons、Flis 等的序列,并且 Packages 和这些其他项目之间似乎存在一对多的关系。

每个Package都有0个或多个TDate,每个TDate都只属于一个Package,即外键PackageId所指的Package。

同样,每一个 Ginc 都属于外键所指的 Package,每一个 Con 和 Fli 等都属于外键 PackageId 所指的唯一一个包:都是直截了当的一对多关系

要求:给定一个 packageId,给我这个 Id 的包裹,它的旅行数据,它的 Gincs,它的 Flis,以及它所有其他名字奇怪的项目。

要能够使用 LINQ 执行此操作,您需要有权访问 IQueryables。例如,通过DbContext.DbSet&lt;...&gt;

int packageId = ...
IQueryable<Package> packages = ...
IQueryable<TDate> tDates = ...
IQueryable<Fli> Flis = ...
...

var result = packages.Where(package => package.Id == packageId).Select(package => new
{
    // Select the package properties that you plan to use:
    Id = package.Id,
    Name = package.Name,
    Status = package.Status,
    ...

    TDates = tDates.Where(tDate => tDate.PackageId == package.Id).Select(tDate => new
    {
        Id = tDate.Id,
        DateFrom = tDate.DateFrom,
        DateTo = tDate.DateTo,
        ...
    })
    .ToList(),

    Flis = flis.Where(fli => fli.PackageId == package.Id).Select(fli => new
    {
         ...
    })
    .ToList(),

    ... etc: 
});

【讨论】:

  • 谢谢,先生,现在我有一个想法,我尝试使用 IList 例如 public List package() {//code} var _package = package.Where(p => p. id).Selec() 因为我使用的是 dapper。
【解决方案2】:

我想你正在寻找 Union 命令,你可以使用 Linq 的查询表示法或点表示法。在进行联合之前,您需要执行您在 cmets 中提到的选择,以便附加的每个对象都属于同一类型。下面的代码是点符号,因为我觉得它更容易阅读:

string[] adminTDs = { "A", "B", "C" };
string[] adminINCs= { "D", "E", "F" };
string[] adminCONs = { "H", "I", "J" };
//Method Syntax
var MS = adminTDs
            .Union(adminINCs)
            .Union(adminCONs).ToList();

有关 LINQ 联合的更多信息,请访问 https://dotnettutorials.net/lesson/linq-union-method/

【讨论】:

  • 我标记了@Harald Coppoolse 先生的答案,因为这是我正在寻找的想法。
  • 无论如何,谢谢你的回答@TeaBaerd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多