给出以下(简化)类:
public class Master
{
public int Id { get; set; }
public string UniqueName { get; set; }
public virtual List<Detail> Details { get; set; }
}
public class Detail
{
public int Id { get; set; }
public string UniqueCode { get; set; }
}
如何为主服务器提供UniqueName,为Lini to Entities的详细信息选择UniqueCode? p>
请注意,从Detail到Master没有导航属性。
如果有导航属性,我想我可以这样做:
Detail detail = (from m in ctx.Master.Include(p=>p.Details)
join d in ctx.Details
on m.Id = d.MasterId
where m.UniqueName == "Something" && d.UniqueCode == "Else"
select d).SingleOrDefault();
如果没有从Detail到Master的导航属性,我看不到如何在没有首先获取Master的情况下继续进行,包括该Master的所有Detail实例,然后迭代Detail实例。如果给定的Master有许多Detail实例,那可能效率很低。
答案 0 :(得分:0)
尝试
var detail = ctx.Master.Where(m => m.UniqueName == "Something")
.Select(m => m.Details.Where(d => d.UniqueCode == "Else").FirstOrDefault())
.SingleOrDefault();
答案 1 :(得分:0)
我不完全确定你将linq用于对象,或者linq用于实体。如果只涉及您的课程,请尝试此查询:
var mst = new List<Master> {
new Master { Id = 1, UniqueName = "Something", Details = new List<Detail> {
new Detail { Id = 10, UniqueCode = "Else" }, new Detail { Id = 11, UniqueCode = "det1" }}
} ,
new Master { Id = 2, UniqueName = "mast2", Details = new List<Detail> { new Detail { Id = 20, UniqueCode = "det2" } } }
};
var detail = (from d in
((from m in mst
where m.UniqueName == "Something"
select m.Details).SingleOrDefault())
where d.UniqueCode == "Else"
select d).SingleOrDefault();
如果你有数据表,那么Detail表可能有一个MasterID(int)列,所以我会尝试以下查询:
var detail = (from d in ctx.Detail
where d.MasterID == (
(from m in ctx.Master
where m.UniqueName == "Something"
select m.Id).SingleOrDefault())
&& d.UniqueCode == "Else"
select d).SingleOrDefault();