0

背景

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

由于 RIA 类不支持JOIN表之间的多个 s,因此有必要将 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);
}
4

3 回答 3

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()))

会工作。

于 2009-09-25T18:28:13.923 回答
0

那么你的方法返回什么这听起来像是某种没有实现的列表,IEnumerable或者IEnumerable<T>我们不知道它支持什么。

于 2009-09-24T09:53:56.553 回答
0

与所有 Silverlight 通信一样,RIA 服务是异步的。你也弄错了模式。你不能直接用 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 服务,以便您的代码完全有意义。您应该使用 7 月 CTP。

于 2009-09-30T15:50:32.397 回答