在实体框架中不带导航属性的情况下从细节导航到主视图



给定以下(简化)类:

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; }
}

如何使用Linq to Entities为Master指定UniqueName并为Detail指定UniqueCode来选择特定的Detail实例?

请注意,没有从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实例,那么效率可能会很低。

尝试

var detail = ctx.Master.Where(m => m.UniqueName == "Something")
    .Select(m => m.Details.Where(d => d.UniqueCode == "Else").FirstOrDefault())
    .SingleOrDefault();

我不完全确定您是对对象使用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();

相关内容

最新更新