【问题标题】:C# Silverlight with Entity Framework - Change Return Type On AutoGenerated EntityQuery?带有实体框架的 C# Silverlight - 更改自动生成的实体查询的返回类型?
【发布时间】:2009-09-28 12:24:52
【问题描述】:

背景

目前我有一个使用 RIA 服务的 C# Silverlight 业务应用程序。该应用程序托管在 ASP.NET 中,使用 ADO.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);
    }

(由于该方法是自动生成的,因此失败,它只是恢复到我构建解决方案时的状态。)

非常感谢您的帮助。

【问题讨论】:

  • 很高兴看到问题的格式如此之好...

标签: c# silverlight entity-framework ienumerable


【解决方案1】:

问题是您在调用和 IEnumerable 集合之间缺少一步。

您需要执行 EntityQuery 并使用 LoadOperation 来获取结果。这并不像您想象的那么简单,这里有一个很好的论坛帖子,其中有一个如何处理事情的示例:

How to get a List<> from LoadOperation

这是示例中的相关行:

EntityQuery query = Context.GetEmployeesQuery();

Context.Load<Employee>(query).Completed += (sender, args) => {
    List<Employee> list = ((LoadOperation<Employee>)sender).Entities.ToList();
};

【讨论】:

    【解决方案2】:

    您需要加载查询并从加载操作中获取结果。您的 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。

    【讨论】:

    • loadOperation 没有可用的“.Completed”方法。它也没有“.HasError”。有什么想法吗?
    • @Goober:Ups,忘记使用DomainContext.Load 方法。希望代码是正确的。现在。
    • 谢谢,我启动了代码但无济于事,一切都编译得很好,所以我开始怀疑我的 Linq 查询是否真的正确...... :-(
    • @Goober:您可以通过在三个位置放置断点来进行调试:第一个断点是您调用context.Load 时。下一个断点在GetJobImagesQuery。确保此方法返回一个非空集合。第三个断点在Completed lambda 中。 loadOperation.Entities 应该包含GetJobImagesQuery 返回的实体的客户端版本。如果你真的很绝望,你也可以使用像 Fiddler 这样的工具来查看网络上的数据。如果您使用的是内置 Web 服务器,则必须在 localhost 后添加一个尾随点才能查看 Fiddler 中的流量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多