Linq 查询,用于在 List 对象中存储一对多集合

本文关键字:存储 一对多 集合 对象 List 查询 用于 Linq | 更新日期: 2023-09-27 18:31:08

我有两个表(应用程序和危险),具有一对多关系。

我想将危险列表存储在我的 ViewModel 中的 List 对象中。

applicationVm(大大简化为仅显示集合):

 ...
 public List<Hazard> Hazards { get; set; }

LINQ 查询(大大简化为仅显示集合):

  IQueryable<ApplicationVm> applVms;
  applVms = from app in _db.Applications
    ...
    join hz in _db.Hazards on app.Id equals hz.ApplicationId into hzr
      from hzrd in hzr.DefaultIfEmpty()
    select new ApplicationVm { ..., Hazards = hzrd };

智能感知在选择中的危害 = hzrd 上显示错误"无法将源类型危险隐藏到目标类型 List<Hazard>"。

如何编写此 LINQ 查询。

PS 我不想将 applVms 作为列表返回,因为我是懒惰加载。

Linq 查询,用于在 List 对象中存储一对多集合

我试过了,它有效。

class Program
    {
        static void Main(string[] args)
        {
            List<Application> application = new List<Application>();
            List<Hazard> hazard = new List<Hazard>();
            int appID = 1;
            int hazID = 1;
            for (int i = 0; i < 10; i++)
            {
                application.Add(new Application() { AppID = appID, AppName = string.Format("AppName{0}", i + 1) });
                hazard.Add(new Hazard() { HazID = hazID, AppID = appID, HazName = string.Format("HazName{0}", hazID) });
                hazID++;
                hazard.Add(new Hazard() { HazID = hazID, AppID = appID, HazName = string.Format("HazName{0}", hazID) });
                hazID++;
                appID++;
            }
            IEnumerable<AppHaz> appHaz = from app in application
                                   select new AppHaz { AppID = app.AppID, Hazards = (from haz in hazard where haz.AppID == app.AppID select haz).ToList() };
        }
    }
    class Application
    {
        public int AppID { get; set; }
        public string AppName { get; set; }
    }
    class Hazard
    {
        public int HazID { get; set; }
        public int AppID { get; set; }
        public string HazName { get; set; }
    }
    class AppHaz
    {
        public int AppID { get; set; }
        public List<Hazard> Hazards { get; set; }
    }

这里

from hzrd in hzr.DefaultIfEmpty()
select new ApplicationVm { ..., Hazards = hzrd };

第一行基本上展平了组连接的结果,因此hzrd的类型为 Hazard

要获得所需的结果,请删除第一行并像这样更改第二行

select new ApplicationVm { ..., Hazards = hzr.ToLIst() };

为什么不使用导航属性应用。危害?

无论如何,这应该有效:

_db.Applications.GroupJoin(_db.Hazards, a=>a.Id, h=>h.ApplicationId,(a,hzds)=> new ApplicationVm {...,Hazards = hzds,...})

另外,也许您的列表应该是IEnumerable(抱歉,我不在计算机中,所以我无法测试它)