diff --git b/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php a/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
index ebee8e4..03a2305 100644
--- b/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
+++ a/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
@@ -805,9 +805,6 @@ class EntityFieldQuery {
     }
 
     $base_table = $entity_info['base table'];
-    $data_table = 'data';
-    $data_table_schema = array();
-
     $select_query = db_select($base_table);
     $select_query->addExpression(':entity_type', 'entity_type', array(':entity_type' => $entity_type));
     $sql_field = $entity_info['entity keys']['id'];
@@ -815,17 +812,19 @@ class EntityFieldQuery {
     // If a data table is defined we need to join it and make sure that only one
     // record per entity is returned.
     if (!empty($entity_info['data table'])) {
-      $table = $entity_info['data table'];
-      $data_table_schema = drupal_get_schema($table);
-      $select_query->innerJoin($table, $data_table, "$data_table.$sql_field = $base_table.$sql_field");
+      $data_table = $entity_info['data table'];
+      $select_query->innerJoin($data_table, NULL, "$data_table.$sql_field = $base_table.$sql_field");
       $select_query->distinct(TRUE);
+      $property_table = $data_table;
+    }
+    else {
+      $property_table = $base_table;
     }
 
     // Process the property conditions.
     foreach ($this->propertyConditions as $property_condition) {
       $column = $property_condition['column'];
-      $table = isset($data_table_schema['fields'][$column]) ? $data_table : $base_table;
-      $this->addCondition($select_query, "$table.$column", $property_condition);
+      $this->addCondition($select_query, "$property_table.$column", $property_condition);
     }
 
     // Process the six possible entity condition.
diff --git b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php a/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
index b31e5ce..2ad4d4f 100644
--- b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
+++ a/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
@@ -9,8 +9,9 @@ namespace Drupal\entity_test;
 
 use PDO;
 
-use Drupal\entity\EntityInterface;
 use Drupal\entity\DatabaseStorageController;
+use Drupal\entity\EntityFieldQuery;
+use Drupal\entity\EntityInterface;
 
 /**
  * Defines the controller class for the test entity.
@@ -21,40 +22,24 @@ use Drupal\entity\DatabaseStorageController;
 class EntityTestStorageController extends DatabaseStorageController {
 
   /**
-   * Overrides Drupal\entity\DatabaseStorageController::loadByProperties().
+   * Overrides Drupal\entity\DatabaseStorageController::buildPropertyQuery().
    */
-  public function loadByProperties(array $values) {
-    $query = db_select($this->entityInfo['base table'], 'base');
-    $query->addTag($this->entityType . '_load_multiple');
-    if ($values) {
-      // Conditions need to be applied the property data table.
-      $query->addJoin('inner', 'entity_test_property_data', 'data', "base.{$this->idKey} = data.{$this->idKey}");
-      $query->distinct(TRUE);
-
-      // @todo We should not be using a condition to specify whether conditions
-      // apply to the default language or not. We need to move this to a
-      // separate parameter during the following API refactoring.
-      // Default to the original entity language if not explicitly specified
-      // otherwise.
-      if (!array_key_exists('default_langcode', $values)) {
-        $values['default_langcode'] = 1;
-      }
-      // If the 'default_langcode' flag is esplicitly not set, we do not care
-      // whether the queried values are in the original entity language or not.
-      elseif ($values['default_langcode'] === NULL) {
-        unset($values['default_langcode']);
-      }
-
-      $data_schema = drupal_get_schema('entity_test_property_data');
-      $query->addField('data', $this->idKey);
-      foreach ($values as $field => $value) {
-        // Check on which table the condition needs to be added.
-        $table = isset($data_schema['fields'][$field]) ? 'data' : 'base';
-        $query->condition($table . '.' . $field, $value);
-      }
+  protected function buildPropertyQuery(EntityFieldQuery $entity_query, array $values) {
+    // @todo We should not be using a condition to specify whether conditions
+    // apply to the default language or not. We need to move this to a
+    // separate parameter during the following API refactoring.
+    // Default to the original entity language if not explicitly specified
+    // otherwise.
+    if (!array_key_exists('default_langcode', $values)) {
+      $values['default_langcode'] = 1;
     }
-    $ids = $query->execute()->fetchCol();
-    return $ids ? $this->load($ids) : array();
+    // If the 'default_langcode' flag is esplicitly not set, we do not care
+    // whether the queried values are in the original entity language or not.
+    elseif ($values['default_langcode'] === NULL) {
+      unset($values['default_langcode']);
+    }
+
+    parent::buildPropertyQuery($entity_query, $values);
   }
 
   /**
