返回时FirstOrDefault()类型错误?

时间:2009-08-25 19:01:10

标签: wpf wcf entity-framework ria

RIA Domain服务有这种方法......

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 []'。

我的印象是它只会重新调整null,我可以稍后测试。但不知何故,这种情况并没有发生。我发现的所有例子都显示出这样的工作正常。

任何洞察力都有帮助,我对EF,RIA和Wcf有点困惑和一点点新闻。

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

GetCmsDealer中的try / catch解决方案将允许我检测失败,但是仍然没有办法重新检查“空”CmsDealer对象而不会伪造一些约束(看起来实体对它很挑剔)。

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

谢谢!

已更新

对于那些想知道它是如何发挥作用的人来说,最后的例程看起来像这样......

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

Wcf包装器现在又回到了简单的传递过程。在客户端我检查结果的Count(),如果它是0然后我可以知道没有记录,如果它是1然后一个简单的First()得到我的记录。

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

3 个答案:

答案 0 :(得分:3)

您还可以修改域服务以进行选择,这样您就可以获得可以在WCF服务中测试的IEnumerable(如果我没有记错,则会有一个计数)。所以你要修改它是这样的: public virtual IEnumerable GetDealer(string id){    return this.Context.CmsDealerSet.Select(p =&gt; p.Id == id); }

然后在WCF服务中,您可以执行以下操作: public CmsDealer GetDealer(string id) {     var x = domainservice.GetCmsDealer(id);     if(x.Count()== 0)     {         //哎呀,这里没什么可看的     } else {         //住在这里     } }

答案 1 :(得分:3)

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

更改域服务功能如下

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

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

答案 2 :(得分:0)

如果找不到匹配的记录,FirstOrDefault将返回Null。我怀疑您的服务出现null返回问题。如果没有找到匹配项,我建议更改此项以抛出异常并在客户端捕获异常。

吉姆