Возврат нескольких сущностей из LinqToSQL (или EF) - PullRequest
1 голос
/ 05 декабря 2011

Можно ли вернуть несколько объектов из запроса LinqToSql (или EF) (запрос находится внутри метода), чтобы результаты по-прежнему можно было компоновать?

Примерно так:

public IQueryable<KeyValuePair<Customer, Product>> GetCustomerEntities()
{
    return
    (
        from    customer in this.Context.Customers
                join
                product in this.Context.Products on customer.ID equals product.CustomerID       
        select  new KeyValuePair<Customer, Product>(customer, product)
    );
}

Затем я хочу использовать результат этого метода для дальнейшего составления запроса, например:

this.GetCustomerEntities().Where(e => e.Key.Name == "my customer")

Приведенный выше метод компилируется, но он не может быть выполнен LinqToSql, поскольку он не может преобразовать KeyValuePair в SQL, что является ожидаемым поведением.

Можно ли как-то этого добиться?

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Проблема здесь в том, что среда выполнения не может видеть, что передача customer в параметр конструктора - это то же самое, что и просмотр e.Key, поскольку эти две вещи, очевидно, не одинаковы. Вы можете попробовать создать свой собственный тип POCO с помощью getter и setter, т.е.

select new CustomerProduct { Customer = customer, Product = product }

и использовать его вместо KeyValuePair<Customer,Product>.

Внутри одного метода анонимный тип был бы очевидным выбором.

0 голосов
/ 05 декабря 2011
this.GetCustomerEntities().ToList().Where(e => e.Key.Name == "my customer")

Это должно работать.Это не самая эффективная вещь, но, по крайней мере, она будет работать.Как только вы перечислите его (с помощью ToList ()), запрос будет выполняться на сервере SQL, и все дальнейшие операции будут выполняться с перечислением в памяти.Это позволяет вам свободно использовать класс KeyValuePair.

Если вы хотите дополнительно составить запрос специально для использования преимуществ SQL, то вам, вероятно, следует параметризовать свою функцию и получать только те строки, которые вы хотите получить из базы данных впервое место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...