代码之家  ›  专栏  ›  技术社区  ›  Dean

实体框架如何查询导航属性表中的数据

  •  1
  • Dean  · 技术社区  · 15 年前

    我有以下设置

    m_handsets=from p in rl.app.tcommentities.tbltelephonenumbers_
    其中p.companyid=m_companyid_
    选择P
    
    M_Handsets=DirectCast(M_Handsets,ObjectQuery(属于RL.电话号码))。包括(“TblCalls”)。
    < /代码> 
    
    

    其中M_手机定义为

    private m_handsets as iqueryable(of rl.tbltelephonenumbers)
    < /代码> 
    
    

    它按预期工作,但是我想知道的是查询导航属性(tblcall),这样我可以执行如下操作

    from p in m_handsets.tblcall
    其中m_handset.tblcall.price>100
    < /代码> 
    
    

    但是我不知道正确的语法,有人能帮忙吗?

    编辑:

    我认为这里的复杂性是因为在这种情况下,我可以在M&U手机中有5个tbltelephonenumber,然后再打x个电话号码。我对每个的tblcall都感兴趣,但我想为每个tblterhoneNumber筛选它们。

    (希望)应该进一步说明的实体图

    所以我现在知道所有与我感兴趣的公司相关的手机。我还可以看到在调试模式下加载为导航属性的调用,但我想说的是采用此筛选器(在本示例中,price>100并将其应用于所有手机->calls

    其中M_手机定义为

    Private m_handsets As IQueryable(Of RL.tblTelephoneNumbers)
    

    它按预期工作,但是我想知道的是查询导航属性(tblcall),这样我可以执行如下操作

    From p In m_handsets.tblCalls 
    Where m_handsets.tblCalls.price > 100
    

    但是我不知道正确的语法,有人能帮忙吗?

    编辑:

    我认为这里的复杂性是因为在这种情况下,我可以在M&U手机中有5个tbltelephonenumber,然后再打x个电话号码。我对每个的tblcall都感兴趣,但我想为每个tblterhoneNumber过滤所有的tblcall。

    (希望)应该进一步说明的实体图 diagram

    所以我现在知道所有与我感兴趣的公司相关的手机。我还可以看到在调试模式下加载为导航属性的调用,但我想说的是采用此筛选器(在本例中,价格为100,并将其应用于所有手机调用

    1 回复  |  直到 15 年前
        1
  •  1
  •   Morteza Manavi    15 年前

    如果正确理解您的问题,那么您有两个解决方案来完成这一点: 在这两个解决方案中,您将看到我删除了 include->method since include->em>不允许您过滤相关数据。
    BR/> <强> 1。过滤投影(返回异常类型) :

    dim results=from p in rl.app.tcommentities.tbltelephonenumbers_
    其中p.companyid=m_companyid_
    用选择“新建”。手机=P,,_
    .tblcall=p.tblcall.where(函数(t)t.price>100)
    
    

    .>.

    但是,在所有情况下,它可能并不理想,因为它提供了匿名类型对象的集合。

    BR/> < b > 2。两个跟踪查询(返回EntityObjects):。 < BR> 此项为您提供EntityObject tbltelephoneNumbers的集合:
    BR/>
    dim m_handsets=(from p in rl.app.tcommentities.tbltelephonenumbers_
    其中p.companyid=m_companyid选择p).tolist()。
    
    dim m_tblcalls=(来自rl.app.tcommentities.tblcalls中的t)_
    其中t.price>100选择t).tolist();
    
    foreach(dim t in m_tblcall)
    M_handsets.single(功能(H)H.ID=T.tbltelephonenumberID).tblcall.add(T)
    末尾
    < /代码> 
    
    
    <强> 3。利用Attach方法(返回EntityObjects): < BR> 最后一个也可能是最好和最优雅的解决方案是使用entitycollection.attach>a>method along withentitycollection.createsourcequery>

    foreach(手机中的var-tel){
    
    iqueryable<tblcall>sourceQuery=tel.tblcall.createSourceQuery())
    。其中(c=>c.price>100);
    tel.tblcall.attach(源查询);
    }
    < /代码> 
    
    
    抱歉,如果出现任何VB语法错误,我都会从头写下来。

    艾美型):

    dim results=来自rl.app.tcommentities.tbltelephonenumbers中的p_
    其中p.companyid=m_companyid_
    用选择“新建”。手机=P,,_
    .tblcall=p.tblcall.where(函数(t)t.price>100)
    
    

    但是,在所有情况下,它可能并不理想,因为它提供了匿名类型对象的集合。


    2。两个跟踪查询(返回EntityObjects):
    此项为您提供EntityObject tbltelephoneNumbers的集合:

    Dim m_handsets = (From p In RL.App.TComEntities.tblTelephoneNumbers _
                      Where p.companyId = m_CompanyID Select p).ToList()
    
    Dim m_tblCalls = (From t In RL.App.TComEntities.tblCalls _
                      Where t.price > 100 Select t).ToList();
    
    ForEach(Dim t In m_tblCalls) 
        m_handsets.Single(Function(h) h.ID = t.tblTelephoneNumberID).tblCalls.Add(t)
    End ForEach
    


    三。利用Attach方法(返回EntityObjects):
    最后可能也是最好和最优雅的解决方案是使用
    EntityCollection.Attach方法与EntityCollection.CreateSourceQuery:

    foreach (var tel in m_handsets) {
    
        IQueryable<tblCalls> sourceQuery = tel.tblCalls.CreateSourceQuery()
                                                       .Where(c => c.price > 100);
        tel.tblCalls.Attach(sourceQuery);
    }
    


    抱歉,我把所有的VB语法错误都写了下来。