[英]C# Silverlight with Entity Framework - Change Return Type On AutoGenerated EntityQuery?
目前,我有一個使用RIA服務的C#Silverlight業務應用程序。 該應用程序使用ADO.NET實體框架和域服務類托管在ASP.NET中,以讀取和寫入SQL Server數據庫。
我的DomainServiceClass中有一個服務器端方法,該方法返回IEnumerable對象列表。 在我的ApplicationName.Web.g.cs文件中,我也有一個自動生成的函數。 在我的Silverlight客戶端應用程序中,我希望能夠對返回的對象列表運行一個foreach循環。
public IEnumerable<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
select new Image
{
HighResUrl = i.HighResUrl,
LowResUrl = i.LowResUrl,
UploadDate = i.UploadDate
}).AsEnumerable();
return query;
}
/// <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);
}
var context = dds.DomainContext as InmZenDomainContext;
foreach(var item in context.GetJobImagesQuery(currentJob.JobID.ToString())
{
item.etc.....//
}
不幸的是,當我嘗試如上所述調用此方法時,收到以下錯誤之一:
“無法將類型System.Windows.Ria.Data.EntityQuery隱式轉換為System.Collections.IEnumerable”。
要么
“不包含GetEnumerator的公共定義”。
在閱讀並與他人交談之后,我被告知我需要更改自動生成函數的返回類型(我認為)。
有人知道我可以在此AutoGenerated EntityQuery上將返回類型更改為IEnumerable的方法嗎? -還是以其他方式解決此問題?
/// <summary>
/// Returns an EntityQuery for query operation 'GetJobImages'.
/// </summary>
public IEnumerable<Image> GetJobImagesQuery(string jobGuid)
{
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("jobGuid", jobGuid);
return base.CreateQuery<Image>("GetJobImages", parameters, false, true);
}
(由於該方法是自動生成的,因此失敗,它只是回彈到構建解決方案時的狀態。)
幫助極大的贊賞。
問題在於您在調用和IEnumerable集合之間缺少一個步驟。
您需要執行EntityQuery並使用LoadOperation來獲取結果。 它並不像您想的那么簡單,這是一篇不錯的論壇帖子,其中包含如何處理問題的示例:
這是示例中的相關行:
EntityQuery query = Context.GetEmployeesQuery();
Context.Load<Employee>(query).Completed += (sender, args) => {
List<Employee> list = ((LoadOperation<Employee>)sender).Entities.ToList();
};
您需要加載查詢並從加載操作中獲取結果。 您的Silverlight客戶端調用代碼應修改為以下形式:
var context = dds.DomainContext as InmZenDomainContext;
var loadOperation = context.Load(context.GetJobImagesQuery(currentJob.JobID.ToString()));
loadOperation.Completed += (sender, e) => {
if (!loadOperation.HasError)
foreach (var item in loadOperation.Entities)
// Loop over returned items ... Or use LINQ on loadOperation.Entities.
else
// loadOperation.Error has details about the error.
...
}
請注意,所有“網絡調用”在Silverlight中都是異步的。
我還建議您考慮將查詢參數從字符串更改為GUID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.