目前我有一个使用RIA服务的C#Silverlight业务应用程序。该应用程序使用ADO.NET实体框架和域服务类托管在ASP.NET中,以读取和写入SQL Server数据库。
由于RIA类不支持表之间的多个JOIN
,因此有必要将LINQ作为域服务的一部分实现到JOIN
所有表并返回结果。
当我尝试在返回的对象列表上使用foreach
循环时收到错误消息:
不包含GetEnumerator的公共定义
从这种方法中获取数据有哪些选择?
大多数时候我只需要一个对象,所以我可以修改方法来选择第一个结果并返回一个对象。
此方法存在于域服务类中。此方法定义上下文,然后在Silverlight客户端中调用该方法。
var context = dds.DomainContext as InmZenDomainContext;
context.GetJobImagesQuery(imageJob.JobID.ToString())
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);
}
答案 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)
你的方法返回的是什么?这听起来像某种列表没有实现IEnumerable
或IEnumerable<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。