C#Silverlight - 在没有Foreach&amp ;;的情况下获取数据。的GetEnumerator()

时间:2009-09-24 09:47:43

标签: c# silverlight wcf-ria-services

背景

目前我有一个使用RIA服务的C#Silverlight业务应用程序。该应用程序使用ADO.NET实体框架和域服务类托管在ASP.NET中,以读取和写入SQL Server数据库。

由于RIA类不支持表之间的多个JOIN,因此有必要将LINQ作为域服务的一部分实现到JOIN所有表并返回结果。

问题

当我尝试在返回的对象列表上使用foreach循环时收到错误消息:

  

不包含GetEnumerator的公共定义

从这种方法中获取数据有哪些选择?

大多数时候我只需要一个对象,所以我可以修改方法来选择第一个结果并返回一个对象。

此方法存在于域服务类中。此方法定义上下文,然后在Silverlight客户端中调用该方法。

从Silverlight客户端调用方法

var context = dds.DomainContext as InmZenDomainContext;
context.GetJobImagesQuery(imageJob.JobID.ToString())

服务器端Linq查询方法(存在于域服务类中)

public List<Image> GetJobImages(string jobGuid)
{
    var query =
        (
            from j in Context.Job
            orderby (j.ShortCode)
            where j.JobID.Equals(jobGuid)
            join a in Context.Audit //.Distinct()
            on j.JobID equals a.Job.JobID
            join i in Context.Image
            on a.Image.JobID equals i.JobID
            //join s in Context.States
            //on z.States.StateID equals s.StateID
            select new Image
            {
                //ShortCode = j.ShortCode,
                HighResUrl = i.HighResUrl,
                LowResUrl = i.LowResUrl,
                UploadDate = i.UploadDate
            }
        ).ToList();
    return query;
}

调用方法

var context = dds.DomainContext as InmZenDomainContext;
foreach (var item in context.GetJobImagesQuery(imageJob.JobID.ToString()))
{

}

GetJobImagesQuery声明(生成的代码文件中存在 - .Web.g.cs):

/// <summary>
/// Returns an EntityQuery for query operation 'GetJobImages'.
/// </summary>
public EntityQuery<Image> GetJobImagesQuery(string jobGuid)
{
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("jobGuid", jobGuid);
    return base.CreateQuery<Image>("GetJobImages", parameters, false, true);
}

3 个答案:

答案 0 :(得分:1)

GetJobImagesQuery是一个由于GetJobImages函数而生成的方法。您的方法不应返回图像列表,而是返回IQueryable实体对象列表。

例如:

public IQueryable<TableName> GetTableByID(long otherTable_ID)
{
    return this.Context.TableName.Where((x) => x.otherTable_ID == otherTable_ID);
}

将生成:

public EntityQuery<TableName> GetTableNameByRx_IDQuery(long otherTable_ID)
{
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("otherTable_ID", otherTable_ID);
    return base.CreateQuery<TableName>("GetTableNameByotherTable_ID", parameters, false, true);
}

我认为如果您将GetJobImages的返回类型更改为类型为“Image”的IQueryable,您可以使用foreach获取图像。

public List<Image> GetJobImages(string jobGuid)

会变成:

public IQueryable<Image> GetJobImages(string jobGuid)

然后你的代码:

foreach (var item in context.GetJobImagesQuery(imageJob.JobID.ToString()))

会起作用。

答案 1 :(得分:0)

你的方法返回的是什么?这听起来像某种列表没有实现IEnumerableIEnumerable<T>,但我们无法分辨它做什么支持。

答案 2 :(得分:0)

与所有Silverlight通信一样,RIA Services是异步的。你也得到错误的模式。您无法直接使用context.getJobImagesQuery(imageJob.JobID.ToString())执行任何操作。您必须在加载操作中使用它。 Load是异步并返回LoadOperation对象。如果计划要绑定到返回的实体,那么模式通常是立即将绑定设置为LoadOperation.Entities。使用INotifyCollectionChanged的返回值,所以当加载完成时,绑定也会自动更新。在你的情况下,你想通过返回的实体做一个foreach,所以在这种情况下的模式将如下所示:

    context.Load(context.getJobImagesQuery(imageJob.JobID.ToString()), OnImagesLoaded, null);


private void OnImagesLoaded(LoadOperation lo)
{
  foreach (var item in lo.entities)
 {
 }
}
编辑:你在做什么CTP?我刚刚意识到你可能在一个非常旧的RIA服务版本上为你的代码提供了任何意义。您应该使用July CTP。