簡體   English   中英

具有實體框架的C#Silverlight-更改自動生成的EntityQuery的返回類型?

[英]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循環。

DomainServiceClass方法:

    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;
    }

ApplicationName.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);
    }

Silverlight客戶端調用代碼:

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來獲取結果。 它並不像您想的那么簡單,這是一篇不錯的論壇帖子,其中包含如何處理問題的示例:

如何從LoadOperation獲取List <>

這是示例中的相關行:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM