Заполнение дочернего свойства с помощью Entity Framework SqlQuery - PullRequest
11 голосов
/ 19 октября 2011

Учитывая следующий код POCO Первые сущности

public class Customer
{
    public int CustomerId { get; set; }
    public string CustomerTitle { get; set; }
    public string CustomerFirstName { get; set; }
    public string CustomerLastName { get; set; }

    public ICollection<Order> Orders { get; set; }
}

public class Order
{
   public int OrderId { get; set; }
   ...
   public int CustomerId { get; set; }

   public Customer Customer { get; set; }
}

Используя linq, вы можете получить заполненные ордера, используя свойство Include, как в

var cust = (from cust in context.Customer
            where cust.CustomerId == 1
            select cust)
            .Include(ord => ord.Orders)
            .FirstOrDefault();

Я пытаюсь получитьтот же результат с использованием параматеризованного sql, используя

        Customer co =  context.Customer.SqlQuery(
                    @"select [Customer].[CustomerId], 
                             ...
                             [Order].[OrderId] AS [OrderId], 
                             ...
                            from Customer join Order on Customer.CustomerId = Order.CustomerId where Customer.CustomerId = @custid", sqlParm)
                .FirstOrDefault();

Как получить заполнение Orders в co.Orders с помощью вышеуказанной команды, похоже, что я не могу использовать оператор Include с SqlQuery.Это очень упрощенный пример только для иллюстративных целей, реальные запросы будут более сложными.

Ответы [ 3 ]

15 голосов
/ 19 октября 2011

Это невозможно вообще. Прямое выполнение SQL не предлагает заполнение навигационных свойств, и вы действительно не можете использовать Включить. Вы должны выполнить два отдельных запроса SQL, чтобы получить Cutomer и ее Orders.

1 голос
/ 12 января 2015

Я использовал следующую структуру класса в качестве обходного пути:

public class Customer
{
    public int CustomerId { get; set; }
}

public class Order
{
    public Customer Customer { get; set; }
    private int _customerId;
    private int CustomerId { get { return _customerId; } set { Customer.CustomerId = _customerId = value; } }
    public Order()
    {
        Customer = new Customer();
    }
}

В этом случае вам не нужно запускать запрос дважды, и следующий запрос выдаст заказ клиенту:

db.Database.SqlQuery ("выберите cu.CustomerId, ord.OrderId из заказов и объедините клиента с cu.CustomerId = ord.CustomerId"). ToList ();

0 голосов
/ 05 января 2016

Что мне помогло, так это доступ к связанному члену до того, как использование было закрыто.

public static Customer GetCustomer (int custid)
{
Customer co = null;

using (var context = new YourEntities())
{
    // your code
    co =  context.Customer.SqlQuery(
    @"select [Customer].[CustomerId], 
    ...
    [Order].[OrderId] AS [OrderId], 
    ...
    from Customer join Order on Customer.CustomerId = Order.CustomerId where Customer.CustomerId = @custid", sqlParm)
    .FirstOrDefault();


    // my addition
    // cause lazy loading of Orders before closing the using
    ICollection<Order> orders = co.Orders;

    }

    // can access co.Orders after return.
    return (co);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...