none
Ria Service 怎样表示主从关系表连接查询的结果!我只会对单个表操作! RRS feed

  • 问题

  •   如下,我的主表Element(ElemntID,ElementType,GeometryPoint)

              从表WaterMeter(ID,ElementID) 且ElementID参照Element(ElementID)

     public void LoadWaterMeterElement()
            {
                BSContext client = new BSContext();           
                LoadOperation<WaterMeter> lo = client.Load(client.GetWaterMeterQuery(),WaterMeterElementCallBack, null);  //???我想获取Element和WaterMeter的链接查询的结果,这里该怎么写啊!
            }
            public void WaterMeterElementCallBack(LoadOperation<WaterMeter> lo)
            {          

            }

    ria service 的联接查询怎么弄啊?想获取Element和WaterMeter的链接查询的结果!

     

    2010年5月11日 7:52

答案

  • 这个要在Server实现:

    1. 在DomainService metadata 里WaterMeter partial class中,在Element上添加[Include] 属性
    2. 在查询方法中,用 return this.ObjectContext.WaterMeters.Include("Element");

    这样在client端,你直接load WaterMeter,每个Entity都有对应的Element property.

    • 已标记为答案 joetao 2010年5月12日 0:32
    2010年5月11日 16:53
  • 你加了[Include] attribute了?

     

    • 已标记为答案 joetao 2010年5月12日 3:19
    2010年5月12日 2:04
  • 你加了[Include] attribute了?

     


    我发现在自动产生的 BSService.metadata.cs

    Element实体中已经包含了EntityCollection<WaterMeter> WaterMeter;

    internal sealed class ElementMetadata

    public EntityCollection<WaterMeter> WaterMeter { get; set; }

    }

    但在WaterMeter 只有Element Element

    internal sealed class WaterMeterMetadata

    {

     //public Element Element { get; set; } //我把这句话给该了,改成了下面的了。貌似我这样改了的话好像把整个关系弄乱了!

    public EntityCollection<Element> Element { get; set; }  在上面加上[Include]就可以了。

    }

    谢谢,加上[Include],Element不再为空!这个联合查询的问题已经解决了!

    但好像自动生成的关系,与我需求的好像弄反了,不知道能不能像那样更改原有的关系!

     

    • 已标记为答案 joetao 2010年5月12日 2:50
    2010年5月12日 2:50

全部回复

  • 首先要保证,这两个实体是主从关系在实体是体现。

    然后在回调中写 lo.AllEntities()方法。

    就可以用WaterMeter。Element来访问Element了。

    2010年5月11日 11:05
  • 这个要在Server实现:

    1. 在DomainService metadata 里WaterMeter partial class中,在Element上添加[Include] 属性
    2. 在查询方法中,用 return this.ObjectContext.WaterMeters.Include("Element");

    这样在client端,你直接load WaterMeter,每个Entity都有对应的Element property.

    • 已标记为答案 joetao 2010年5月12日 0:32
    2010年5月11日 16:53
  • 这个要在Server实现:

    1. 在DomainService metadata 里WaterMeter partial class中,在Element上添加[Include] 属性
    2. 在查询方法中,用 return this.ObjectContext.WaterMeters.Include("Element");

    这样在client端,你直接load WaterMeter,每个Entity都有对应的Element property.

    嗯!谢谢了!帮我解决了在整个项目中都时常要用的方法!

    刚开始还准备在client用Linq 做表的join操作!看来是不行的啊(当时想的是我的WaterMeter类型怎么表示他们的联结查询结果呢!所以在这里卡住了!)

    之后看了Jeff Handley 写的ContosoSales 的例子也是这样写的!

    return from store in this.ObjectContext.Stores.Include("StoreContacts").Include("StoreContacts.Contact")
         orderby store.StoreName
         select store;

     

    2010年5月12日 0:10
  • 恩,这里要换一下Linq的思维, 那就是1:1, 1:n的关系是通过Class/Property的HasA来实现的,

    2010年5月12日 0:23
  •   我Service中的这样写的

     public IQueryable<WaterMeter> GetWaterMeterElement()
            {
                return this.ObjectContext.WaterMeter.Include("Element");
            }

    client我是这样写的,但还是没得到他们联合查询结果啊?不知道为什么?

    public void LoadWaterMeterElement()
            {
                BSContext client = new BSContext();
                LoadOperation<WaterMeter> lo = client.Load(client.GetWaterMeterElementQuery(),WaterMeterElementCallBack, null);

            }

            public void WaterMeterElementCallBack(LoadOperation<WaterMeter> lo)
            {
                BSContext client = new BSContext();
                foreach (WaterMeter waterMeter in lo.Entities)
                {
                    string geometryPoint = waterMeter.Element.GeometryPoint;  //经调试发现waterMeter.Element任然为null,证明还是没有做联合查询啊!
                    int waterMeterID = waterMeter.ID;
                    DrawElement(geometryPoint, waterMeterID);
                }
            }

    不知道为什么?请大家帮忙解决下!

    2010年5月12日 1:30
  • 你加了[Include] attribute了?

     

    • 已标记为答案 joetao 2010年5月12日 3:19
    2010年5月12日 2:04
  • 你加了[Include] attribute了?

     


    没有!估计有可能问题出现在这个地方了!呵呵,谢谢!我再试试!
    2010年5月12日 2:19
  • 你加了[Include] attribute了?

     


    我发现在自动产生的 BSService.metadata.cs

    Element实体中已经包含了EntityCollection<WaterMeter> WaterMeter;

    internal sealed class ElementMetadata

    public EntityCollection<WaterMeter> WaterMeter { get; set; }

    }

    但在WaterMeter 只有Element Element

    internal sealed class WaterMeterMetadata

    {

     //public Element Element { get; set; } //我把这句话给该了,改成了下面的了。貌似我这样改了的话好像把整个关系弄乱了!

    public EntityCollection<Element> Element { get; set; }  在上面加上[Include]就可以了。

    }

    谢谢,加上[Include],Element不再为空!这个联合查询的问题已经解决了!

    但好像自动生成的关系,与我需求的好像弄反了,不知道能不能像那样更改原有的关系!

     

    • 已标记为答案 joetao 2010年5月12日 2:50
    2010年5月12日 2:50