【问题标题】:Entity Frameworks - ToList() and 0 Records实体框架 - ToList() 和 0 条记录
【发布时间】:2010-01-13 22:42:57
【问题描述】:

当需要一个记录集(>=1 条记录)时,您如何检查该 0 条记录的情况?

例如:

RivWorks.Model.FeedStoreReadOnly store = new RivWorks.Model.FeedStoreReadOnly(AppSettings.FeedAutosEntities_connString, AppSettings.FeedAutosEntities_metadata, AppSettings.FeedAutosEntities_providerName);
RivWorks.Model.NegotiationAutos.Entities _dbFeed = store.ReadOnlyEntities();
var companyDetails = from a in _dbFeed.ClientClientMap where a.CompanyID == CompanyId select a;
return companyDetails.ToList();

当它返回时,它在 ToList() 上出错,因为没有满足 WHERE 子句的记录。那么,检查 0 条记录的正确方法是什么?此时推荐的回报是多少?


根据以下答案添加:

if (companyDetails.Count() > 0)
    return companyDetails.ToList();
else
{
    List<RivWorks.Model.NegotiationAutos.ClientClientMap> ret = new List<RivWorks.Model.NegotiationAutos.ClientClientMap>();
    ret.Add(companyDetails.FirstOrDefault());
    return ret;
}

尚未测试,但(逻辑上)似乎可行。想知道是否有更简单的方法。


注意:

我明白了。运行 SQL 的帐户没有被 DBA 授予正确的权限集。我们更改了新表/视图上的所有 GRANT 语句,它现在可以工作了。

我仍然不确定正确答案是什么。我倾向于创建一个空白(新)记录并添加到列表中,以便我们接收列表的人可以显示一些内容(如果没有其他内容,请进行编辑)...

【问题讨论】:

  • 您确定是例外吗?它不应该出错,它应该返回一个包含 0 条记录的列表。
  • 你遇到了什么异常?
  • 在内部异常中,我得到“无效的对象名称'dbo.ClientClientMap'”。我不理解这个错误,因为我可以在我的模型中看到该对象并且可以很好地引用它。
  • 我认为你应该删除ret.Add() 调用,它会在你的列表中添加一个null。您只需要 else-branch 中的空列表。
  • 删除与否无关紧要。每当我访问 companyDetails 时都会引发异常。即:companyDetails.Count()、companyDetails.ToList() 等...

标签: c# .net entity-framework


【解决方案1】:

在调用ToList 之前,您无需检查是否为空。 ToList 适用于不返回任何记录的查询;它只会返回一个空列表。您可以使用您的原始代码,无论表格中是否包含数据,一切都会正常工作。

大多数网格等也可以很好地处理空列表;他们通常会为用户显示一个空白行来创建第一条记录。

【讨论】:

    【解决方案2】:

    ClientClientMap 表不在数据库中

    【讨论】:

    • 相反。它确实在数据库中并且是一个视图。我的模型是通过 EF 向导生成的,我没有向其中添加任何其他非数据库派生对象。我也遇到了与表相关联的几个对象的问题。
    • @Keith,也许你的实体模式没有更新,但你的异常与它是一个空结果无关,为了测试这个尝试返回一个带有行的结果。还要检查您的连接字符串,确保您指向正确的数据库。
    • 没有为 SQL Server 中运行请求的帐户设置权限(SELECT/UPDATE)(见上文)。
    【解决方案3】:

    另一个原因可能是数据库的连接字符串包含的数据库名称与您打算使用的不同。 Entity Framework(如果配置有权限)只是根据配置的连接字符串创建不同的数据库,可能会出现你查询的表为空的情况。

    【讨论】:

      【解决方案4】:

      就我而言,实体框架工作正常。我很困惑。

      实际上,我的表在不同的架构中可用,例如“dbo.service.tabel1”,它首先通过代码创建了“dbo.table1”,并且该表中没有正确行为的数据,我期待行。

      人们可以在调试时看到这种可能性。谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 2016-09-10
        相关资源
        最近更新 更多