Полагаю, это невозможно, но я все равно его выброшу.Можно ли использовать CreateSourceQuery при программировании с EF4 CodeFirst API, в CTP4?Я бы хотел загружать свойства, прикрепленные к коллекции свойств, например:
var sourceQuery = this.CurrentInvoice.PropertyInvoices.CreateSourceQuery();
sourceQuery.Include("Property").ToList();
Но, конечно, CreateSourceQuery определен для EntityCollection<T>
, тогда как CodeFirst использует обычный старый ICollection
(очевидно).Есть ли какой-нибудь способ конвертировать?
Я получил приведенное ниже для работы, но это не совсем то, что я ищу.Кто-нибудь знает, как перейти от того, что ниже, к тому, что выше (код ниже от класса, который наследует DbContext)?
ObjectSet<Person> OSPeople = base.ObjectContext.CreateObjectSet<Person>();
OSPeople.Include(Pinner => Pinner.Books).ToList();
Спасибо!
РЕДАКТИРОВАТЬ: вот моя версия решения, опубликованнаяzeeshanhirani - кстати, чья книга замечательная!
dynamic result;
if (invoice.PropertyInvoices is EntityCollection<PropertyInvoice>)
result = (invoices.PropertyInvoices as EntityCollection<PropertyInvoice>).CreateSourceQuery().Yadda.Yadda.Yadda
else
//must be a unit test!
result = invoices.PropertyInvoices;
return result.ToList();
EDIT2:
Хорошо, я только что понял, что вы не можете отправлять методы расширения при использовании динамического.Поэтому я думаю, что мы не вполне столь же динамичны, как Ruby, но приведенный выше пример легко модифицируется для соответствия этому ограничению
EDIT3:
Как упомянуто в блоге zeeshanhiranipost, это работает только в том случае, если (и только если) у вас есть прокси с поддержкой изменений, которые будут созданы, если все ваших свойств объявлены виртуальными.Вот еще одна версия того, как метод может выглядеть для использования CreateSourceQuery с POCOs
public class Person {
public virtual int ID { get; set; }
public virtual string FName { get; set; }
public virtual string LName { get; set; }
public virtual double Weight { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
public class Book {
public virtual int ID { get; set; }
public virtual string Title { get; set; }
public virtual int Pages { get; set; }
public virtual int OwnerID { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual Person Owner { get; set; }
}
public class Genre {
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual Genre ParentGenre { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
public class BookContext : DbContext {
public void PrimeBooksCollectionToIncludeGenres(Person P) {
if (P.Books is EntityCollection<Book>)
(P.Books as EntityCollection<Book>).CreateSourceQuery().Include(b => b.Genres).ToList();
}