【问题标题】:FirstOrDefault() type error on return?返回时 FirstOrDefault() 类型错误?
【发布时间】:2009-08-25 19:01:10
【问题描述】:

RIA 域服务具有此方法...

public virtual CmsDealer GetCmsDealer(string id)
{
    return this.Context.CmsDealerSet.FirstOrDefault(p => p.Id == id);
}

Wcf 服务有这个...

public CmsDealer GetDealer(string id)
{
    return domainservice.GetCmsDealer(id);
}

当使用不存在的 Id 调用时,GetCmsDealer() 调用 barfs 并出现异常

无法将“System.Object[]”类型的对象转换为“RIAServicesLibrary.Web.Models.CmsDealer[]”类型。

我的印象是它只会返回一个空值,我可以稍后进行测试。然而不知何故,这并没有发生。我发现的所有示例都显示这样的工作正常。

任何有帮助的见解,我对 EF、RIA 和 Wcf 有点困惑和有点新手。

更新:问题是我需要一直跟踪失败到 Wcf,以便最终调用 GetDealer 的应用程序可以发现没有解决方案。理想情况下,我需要这样做而不留下未捕获的异常:)

GetCmsDealer 中的 try/catch 解决方案将允许我检测到故障,但仍然无法在不伪造许多约束的情况下重新启动“空”CmsDealer 对象(似乎实体对此很挑剔)。

所以我也可以在 GetDealer 中尝试/捕获,但我仍然没有要返回的有效 CmsDealer 对象。

谢谢!

更新

对于那些想知道结果如何的人来说,最后的程序看起来像这样......

public virtual IQueryable<CmsDealer> GetCmsDealerSetOrEmpty(string id)
{
    return this.Context.CmsDealerSet
        .Include("CmsItemState")
        .Where(p => p.Id == id)
        ;
}

Wcf 包装器现在恢复为简单的传递。在客户端我检查结果的 Count(),如果它是 0,那么我可以知道没有记录,如果它是 1,那么一个简单的 First() 就可以得到记录。

我愿意打赌有更好的方法。

【问题讨论】:

  • 你在哪里遇到这个错误?
  • 我在返回的 Wcf 服务中运行时调试期间遇到错误。

标签: wpf wcf entity-framework ria


【解决方案1】:

您还可以修改域服务以进行选择,这样您将获得一个 IEnumerable(如果我没记错的话,它有一个计数),您可以在 WCF 服务中进行测试。因此,您可以将其修改为: 公共虚拟 IEnumerable GetDealer(字符串 id){ 返回 this.Context.CmsDealerSet.Select(p => p.Id == id); }

然后在 WCF 服务中您可以执行以下操作: 公共 CmsDealer GetDealer(字符串 id) { var x = domainservice.GetCmsDealer(id); if(x.Count() == 0) { // 哎呀,这里没什么可看的 } 别的 { // 在这里直播 } }

【讨论】:

  • 好的,这很聪明 :) 谢谢!
  • 最后,这就是我所做的。 public virtual IQueryable GetCmsDealerSetOrEmpty(string id) { return this.Context.CmsDealerSet .Include("CmsItemState") .Where(p => p.Id == id) ;我通过 wcf 将其传递出去并检查客户端的计数。不过,感觉很丑:)
  • 现在,“选择”需要成为 liams 答案中的 Where。
【解决方案2】:

这是Null Object Pattern 的一个好机会。例如,将 Double.NaN 视为默认值。

如下更改域服务功能

public virtual CmsDealer GetCmsDealer(string id)
{
  return this.Context.CmsDealerSet.FirstOrDefault(p => p.Id == id)??
    CmsDealer.NullValue;
}

允许您在 WCF 服务中拥有一个有效值并在客户端上执行检查

【讨论】:

  • 哇,如果这行得通,那就太棒了。我稍后会检查它,看看它是否有效。谢谢!
  • 好的,我检查了链接。这个模式看起来不错,我会尝试将其构建到下一个项目中。
【解决方案3】:

如果没有找到匹配的记录,FirstOrDefault 将返回 Null。我怀疑您的服务在返回 null 方面存在问题。如果没有找到匹配项,我建议更改它以引发异常并在您的客户端上捕获异常。

吉姆

【讨论】:

  • 问题是当我必须跳到 wcf 客户端时。我可以构造一个我想的空 CmsDealer 对象并将其传递下去,然后在远端对其进行测试。
猜你喜欢
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多