Как я могу запросить свойства навигации, используя linq to sql и ef - PullRequest
2 голосов
/ 05 октября 2010

Я пытаюсь строго набрать запрос для 3 объектов ef, используя linq to sql. Есть отношения «один ко многим» с продуктом и категорией. Мои классы содержат свойства навигации и выглядят так.

public partial class Product
{

public int ID {get;set;}
public string Name {get;set;}
public virtual ICollection<Group> NpGroup {get;set;}
}

public partial class Category
{
public int ID {get;set;}
public string Name {get;set;}
public virtual ICollection<Group> NpGroup {get;set;}
}

public partial class Group
{
public int ID {get;set;}
public int ProductID {get;set;}
public int CategoryID {get;set;}
public virtual Product NpProduct {get;set;}
public virtual Category NpCategory {get;set;}
}

Стараясь избегать строковых значений .Include (), как мне построить запрос, который бы возвращал группу, равную ProductID "1", но также включал в себя названия продукта и категории?

Что-то вроде:

var context = ObjectContext.CurrentObjectContext;
    var query = from c in context.Group
    where c.ProductID == 1
    //Include the names of the product and category of the group record (c.NpProduct.Name etc.)
    select c;

Возможно, мне не хватает деревьев в лесу, но я не могу получить синтаксис ObjectContext.LoadProperty (если это правильный путь).

Есть мысли? Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 октября 2010

Я думаю, что мы все ненавидим использовать напечатанную строку в операторе .include ().

Я начал использовать enum для представления имени таблицы, просто чтобы избежать орфографических ошибок и т. Д.

для моей базы данных около 70 таблиц это заняло у меня 10 минут. чтобы создать enum и мой linq теперь выглядит примерно так:

var context = ObjectContext.CurrentObjectContext; var query = из c в context.Group.Include (TableEnum.Category.ToString ()) где c.ProductID == 1 выберите c;

Опять не идеально, но по крайней мере это проверено компилятором

0 голосов
/ 05 октября 2010

Прежде всего, я сомневаюсь, что вы используете оба L2SQL и EF, поэтому старайтесь не путать людей.

В любом случае, с EF - есть два способа загрузки навигационных свойств:

1 - готовность к загрузке

q.Include("NavPropertyName")

2 - явная загрузка

*After* running your above query - use q.NavPropertyName.Load()

Разница - это вариант 2), вызывает 2 запроса, вариант 1 вызывает внутреннее соединение дляФ.К.

Я могу сочувствовать вашему нежеланию использовать «Включить» из-за «волшебных строк» ​​- я не уверен, почему команда EF не сделала их строго типизированными, однако я уверен, что была веская причина.

Подробнее о загрузке / включении здесь .

HTH

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