Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# 从单个实体框架ExecuteStoreQuery请求读取多个表。_C#_.net_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 从单个实体框架ExecuteStoreQuery请求读取多个表。

C# 从单个实体框架ExecuteStoreQuery请求读取多个表。,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,我有一个库,它使用EF4访问SQL Server数据存储。出于不同的原因,我必须使用SQL Server特定的语法从存储中读取数据(用于自由文本搜索),因此我必须手动创建SQL代码并通过ExecuteStoreQuery方法发送 这很好,除了查询使用联接来请求主表之外的多个表(主表是我在调用ExecuteStoreQuery时指定为目标实体集的表),并且EF从不使用其他表的数据填充主实体的关系属性 有什么特别的事情来填补这些关系吗?在查询中使用其他EF方法或使用特殊的表名还是什么 感谢您的帮助。

我有一个库,它使用EF4访问SQL Server数据存储。出于不同的原因,我必须使用SQL Server特定的语法从存储中读取数据(用于自由文本搜索),因此我必须手动创建SQL代码并通过ExecuteStoreQuery方法发送

这很好,除了查询使用联接来请求主表之外的多个表(主表是我在调用ExecuteStoreQuery时指定为目标实体集的表),并且EF从不使用其他表的数据填充主实体的关系属性

有什么特别的事情来填补这些关系吗?在查询中使用其他EF方法或使用特殊的表名还是什么


感谢您的帮助。

执行direct SQL遵循非常简单的规则:它使用结果集中的列在物化实体中用相同的名称填充属性。我想我在某个地方读到,这只适用于您具体化的主实体(在
ExecuteStoreQuery
=无关系中定义的实体类型),但我现在找不到它。我做了几个测试,它实际上没有填充任何关系

好的,我将在这里写下我最后所做的,这看起来不是一个完美的解决方案,但在这种情况下似乎没有任何完美的解决方案

正如Ladislav所指出的,
ExecuteStoreQuery
(以及其他“自定义查询”方法,
Translate
)只映射指定实体的列,而将所有其他列放在一边。因此,我必须单独加载依赖项,如下所示:

// Execute    
IEnumerable<MainEntity> result = context.ExecuteStoreQuery<MainEntity>(strQuery, "MainEntities", MergeOption.AppendOnly, someParams).ToArray();

// Load relations, first method
foreach (MainEntity e in result)
{
    if (!e.Relation1Reference.IsLoaded)
        e.Relation1Reference.Load();
    if (!e.Relation2Reference.IsLoaded)
        e.Relation2Reference.Load();
    // ...
}

// Load relations, second method
// The main entity contains a navigation property pointing 
// to a record in the OtherEntity entity
foreach(OtherEntity e in context.OtherEntities)
    context.OtherEntities.Attach(e);
//执行
IEnumerable result=context.ExecuteStoreQuery(strQuery,“MainEntities”,MergeOption.AppendOnly,someParams).ToArray();
//荷载关系,第一种方法
foreach(结果中的主要实体)
{
如果(!e.Relation1Reference.IsLoaded)
e、 Relation1Reference.Load();
如果(!e.Relation2Reference.IsLoaded)
e、 Relation2Reference.Load();
// ...
}
//荷载关系,第二种方法
//主实体包含一个导航属性
//到其他实体中的记录
foreach(上下文中的其他实体e.OtherEntities)
上下文。其他实体。附(e);

在那里。我认为这两种技术必须根据生成请求的数量和大小来选择。第一种技术将为每个所需的边记录生成一个记录请求,但不会加载任何不必要的记录。第二种技术使用更少的请求(每个表一个请求),但检索所有记录,因此使用更多内存。

属性似乎非常挑剔。如果您在“选择”中有一列,而该属性不在实体上,则它不喜欢这样。(