Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 默认情况下,如何在数据库中设置实体框架导航属性查询过滤器?_C#_Entity Framework_Dbcontext_Objectcontext - Fatal编程技术网

C# 默认情况下,如何在数据库中设置实体框架导航属性查询过滤器?

C# 默认情况下,如何在数据库中设置实体框架导航属性查询过滤器?,c#,entity-framework,dbcontext,objectcontext,C#,Entity Framework,Dbcontext,Objectcontext,dbcontext api似乎将导航属性设置为ICollections(用于关联的*端)。获取可查询对象的常规方法(如如果您想要计数)似乎是 int count = dbcontext.Entry(entry).Collection(c => c.navprop).Query().Count(); 但是如果你想经常在数据库中过滤,那就不方便了。更重要的是,它也很容易忘记。如果有人无意中说 int count = entry.navprop.Count(); 然后它获取服务器上的所有数据

dbcontext api似乎将导航属性设置为ICollections(用于关联的*端)。获取可查询对象的常规方法(如如果您想要计数)似乎是

int count = dbcontext.Entry(entry).Collection(c => c.navprop).Query().Count();
但是如果你想经常在数据库中过滤,那就不方便了。更重要的是,它也很容易忘记。如果有人无意中说

int count = entry.navprop.Count();
然后它获取服务器上的所有数据并在那里进行计数,这很慢

ObjectContext默认使用的EntityCollection类型也是如此

int count = entry.navprop.CreateSourceQuery().Count();
是否有办法在模型或其他地方设置导航属性的默认集合类型为IQueryable、ObjectQuery或某种可查询类型


注意,这只是导航属性的问题,因为上下文中的实际objectset和dbset项似乎是可查询的;IQueryable是一个接口,其实现根据数据源(集合就是数据源)评估查询

但是,如果您不喜欢内联一些无害的方法调用,则可以在加载实体对象时加载计数:

from e in EntityA
<optional where clause for entity>
select new
{
    Entity = e,
    filteredNavPropCount = e.navprop.Where( np => <optional where clause for collection> ).Count()
}
来自实体中的e
选择新的
{
实体=e,
filteredNavPropCount=e.navprop.Where(np=>).Count()
}

我想出了一个解决大部分问题的解决方案。我最后做的是在我的模型中使用ObjectContext API,并将需要很长时间才能访问的导航属性设置为私有(用于获取和设置)。通过右键单击nav属性,可以在edmx文件中执行此操作

然后,我为包含私有导航属性的类创建了一个部分类文件,并添加了与此类似的内容

public ObjectQuery<NavPropType> NavPropName
{
   get
   {
      if(privateNavProp != null) //in case lazy loading is disabled or something
         return privateNavProp.CreateSourceQuery();
      else
         return null;
   }
}

即使它足够聪明,不获取所有实体

,但我确实发现在导航属性上调用count不会在db中进行计数,这让我感到惊讶和恼火,但我更大的问题是,人们会看到在导航道具上调用count是有效的,不会再想什么了,即使他们正在从数据库中提取额外数据。您可以在希望过滤nav属性集合或以某种方式聚合它的地方使用它,而无需从数据库中检索所有实体-正如您在问题中所述。ORM的目的不是高性能,而是易用性。没有什么比自定义结果集的存储过程性能更好,但这需要更多的编码工作但是从db中获取e.navprop中的每个对象?在本例b/c中不是这样,查询将计算为SQL语句并在数据库中执行。是否有人知道CreateSourceQuery是否足够慢,值得让类的私有成员在第一次调用getter时设置,并在后续调用中使用,而不是调用getter每次都创建SourceQuery?
db.EntryTable.OrderBy(e => e.privateNavProp.Count())