帶有實體框架的C#Silverlight - 在AutoGenerated EntityQuery上更改返回類型?

c# entity-framework ienumerable silverlight

背景

目前我有一個使用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 AutoGenerated功能:

    /// <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 Function上的返回類型(我認為)。

有沒有人知道我可以在這個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。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因