C# 从客户端访问DomainService中的自定义对象

C# 从客户端访问DomainService中的自定义对象,c#,asp.net,silverlight,entity-framework,C#,Asp.net,Silverlight,Entity Framework,我正在使用域服务从Silverlight客户端从数据库中获取数据 在DomainService1.cs中,我添加了以下内容: [EnableClientAccess()] public class Product { public int productID; public string productName; public List<Part> Parts = new List<Part>(); //Part is alread

我正在使用域服务从Silverlight客户端从数据库中获取数据

在DomainService1.cs中,我添加了以下内容:

[EnableClientAccess()]
public class Product
{
    public int productID;
    public string productName;        
    public List<Part> Parts = new List<Part>(); //Part is already present in Model designer
}
[EnableClientAccess()]
公共类产品
{
公共int productID;
公共字符串产品名称;
public List Parts=new List();//零件已存在于模型设计器中
}
在DomainService1类中,我添加了一个新方法来检索自定义类对象的集合:

[EnableClientAccess()]
 public class DomainService1 : LinqToEntitiesDomainService<HELPERDBNEWEntities1>
 {
     ...
        public List<Product> GetProductsList(...)
        {
            List<Product> resultProducts = new List<Product>();
            ...
            return resultProducts;
        }
 }
[EnableClientAccess()]
公共类DomainService1:LinqToEntitiesDomainService
{
...
公共列表GetProductsList(…)
{
List resultProducts=新列表();
...
返回结果产品;
}
}
我试图从silverlight客户端访问该方法:

DomainService1 ds1 = new DomainService1();
var allproductList = ds1.GetProductsList(...);
ds1.Load<SLProduct>(allproductList).Completed += new EventHandler(Load_Completed); //Not correct usage
domainservice1ds1=新的DomainService1();
var allproductList=ds1.GetProductsList(…);
ds1.Load(allproductList).Completed+=新事件处理程序(Load\u Completed)//用法不正确
然而,这不是调用新方法的正确方法。我在DomainServices.cs中添加新类产品的原因是为了有一个有效的分组。我无法使用实体框架自动生成的模型类实现同样的效果


如何从客户端调用新方法?

我相信这里有一个类似的问题,并给出了答案:

此外,这里还讨论了在域服务中添加自定义方法的总体问题:


虽然我不知道您所说的“调用新方法不是正确的方法”是什么意思,或者如果您遇到任何错误,我想发布一些工作代码可能会有所帮助

我的POCO

    public class GraphPointWithMeta
{
    [Key]
    public Guid PK { get; set; }
    public string SeriesName { get; set; } 
    public string EntityName { get; set; }
    public double Amount { get; set; }

    public GraphPointWithMeta(string seriesName, string entityName, double amount)
    {
        PK = Guid.NewGuid();
        SeriesName = seriesName;
        EntityName = entityName;
        Amount = amount;
    }

    // Default ctor required.
    public GraphPointWithMeta()
    {
        PK = Guid.NewGuid();
    }
}
域服务中的方法(EnableClientAccess装饰类)

客户端回调方法

        private void CallingActivityCompleted(LoadOperation<GraphPointWithMeta> lo)
    {
        // lo.Entities is an IEnumerable<GraphPointWithMeta>            
    }
private void CallingActivityCompleted(加载操作lo)
{
//实体是一个IEnumerable
}

我不确定您的产品类别是否为实际实体。从它的定义方式来看,它似乎不是一个实体。我的答案是假设它不是一个实体。您需要为产品属性应用DataMemberAttribute,而不会加载产品列表-加载用于实体查询(服务端的IQueryable)。您可以这样调用它(客户端):

void GetProductList(操作回调)
{
DomainService ds1=新的DomainService();
ds1.GetProductsList(回调,null);//调用操作调用
}
域服务的(服务器端)方法需要InvokeAttribute,如下所示:

[EnableClientAccess]
public class MyDomainService
{
    [Invoke]
    public List<Product> GetProductList()
    {
        var list = new List<Product>();
        ...
        return list;
    }
}
[EnableClientAccess]
公共类MyDomainService
{
[调用]
公共列表GetProductList()
{
var list=新列表();
...
退货清单;
}
}
下面是如何定义产品类(如果它不是实体):

公共类产品
{
[数据成员]
公共int productID;
[数据成员]
公共字符串产品名称;
[数据成员]
public List Parts=new List();//您可能会遇到一些问题。
//不确定零件是否需要任何其他属性,
//既然你说这是一个实体,也不确定你
//甚至可以有一个实体列表,或者它需要是一个
//实体集合或它需要的内容。您可以
//必须分别打两个电话-一个是为了得到产品
//然后一个去拿零件。
}

就像我说的,我不确定什么样的产品继承自。。。希望这有帮助。

你说的不正确是什么意思,这是唯一的方法。
        private void CallingActivityCompleted(LoadOperation<GraphPointWithMeta> lo)
    {
        // lo.Entities is an IEnumerable<GraphPointWithMeta>            
    }
void GetProductList( Action<InvokeOperation<List<Product>>> callback)
{
    DomainService ds1 = new DomainService();
    ds1.GetProductsList(callback, null);//invoke operation call
}
[EnableClientAccess]
public class MyDomainService
{
    [Invoke]
    public List<Product> GetProductList()
    {
        var list = new List<Product>();
        ...
        return list;
    }
}
public class Product
{
   [DataMember]
   public int productID;
   [DataMember]
   public string productName;        
   [DataMember]
   public List<Part> Parts = new List<Part>(); // you might have some trouble here.
                           //not sure if any other attributes are needed for Parts,
                           //since you said this is an entity; also not sure if you 
                           //can even have a list of entities or it needs to be an
                           //entity collection or what it needs to be.  You might
                           //have to make two separate calls - one to get the products
                           //and then one to get the parts.
}