我有两张桌子(应用程序和危险),有一对多关系。
我想在我的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 };
Intellisense在选择中的Hazards = hzrd上显示错误'无法将源类型隐藏到目标类型List<Hazard>
'。
如何编写此LINQ查询。
PS我不想将applVms作为列表返回,因为我懒得加载。
答案 0 :(得分:2)
我尝试了它并且有效。
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; }
}
答案 1 :(得分:1)
下面
from hzrd in hzr.DefaultIfEmpty()
select new ApplicationVm { ..., Hazards = hzrd };
第一行基本上使组连接的结果变平,因此hzrd
的类型为Hazard
。
要获得所需的结果,请删除第一行并像这样更改第二行
select new ApplicationVm { ..., Hazards = hzr.ToLIst() };
答案 2 :(得分:0)
为什么不使用导航属性app.Hazards?
无论如何,这应该有效:
_db.Applications.GroupJoin(_db.Hazards, a=>a.Id, h=>h.ApplicationId,(a,hzds)=> new ApplicationVm {...,Hazards = hzds,...})
也许你的名单应该是IEnumerable(对不起,我已经离开了电脑,所以我无法测试它)