Linq to Entity Framework m2m запрос с простым ограничением строки - PullRequest
0 голосов
/ 16 августа 2011

Попытка выучить Linq to EF в проекте MVC3 ...
Отношение многие ко многим в Entity Framework:

        Shirt              ShirtType           Type
     -----------        -------------        ---------
       <b>ShirtID</b>             <b>ShirtID</b>            <b>TypeID</b>
      ShirtName            <b>TypeID</b>            TypeName
      ShirtPrice

Нет других полей в ShirtType таблице сопоставления, так что теперь у меня естьсвойства навигации в обеих сущностях Shirt.Type и Type.Shirt.
Перед созданием сущностей из базы данных я создал сложный PK в ShirtType, включающий оба внешних ключа.
Я заполнил базу данных значениями.
Вот код, который я использовал для запроса базы данных, чтобы вернуть рубашки, на которые ссылаются с типом Type.Name==tName

public ActionResult Browse(string tName)
        {
            using (TShopEntities db=new TShopEntities())
            {
                var typeModel = from s in db.Shirt
                                from t in s.Type
                                where t.TypeName == tName
                                select new tsStore.ModelView.ShirtView()
                                {
                                    ShirtName=s.ShirtName,
                                    ShirtPrice=s.ShirtPrice
                                };
                return View(typeModel.ToList());
            }
        }

Мой запрос linq ничего не возвращает, и представление печатает только заголовки.Я застрял здесь на некоторое время, является ли запрос linq неправильным или я должен искать какую-то другую ошибку?

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Предполагая, что это запрос, который вы хотите:

вернуть рубашки, на которые ссылаются с типом Type.Name == tName

И предполагая, что ваша модель EF и база данныхправильно (трудно сказать, так как я не вижу скриншота вашего EDMX или вашего FK).

У вас должно быть 2 объекта на EDMX - Shirt и Type.Таблица соединения будет скрыта, так как EF достаточно умен, чтобы выполнять неявное соединение за кулисами.

Тогда этот запрос должен работать:

var shirtsOfAParticularType = db.Shirts.Where(shirt => shirt.Types.Any(type => type.TypeName == "someTypeName")).ToList();

Помните, поскольку это много .. многоРубашка может быть разных типов.Таким образом, запрос выше вернет рубашки, которые имеют хотя бы один тип того, который вы укажете.

Это то, что вы хотите?

0 голосов
/ 16 августа 2011

Когда вы загружаете все три сущности в edmx, структура сущностей создала две сущности, а не три:

A. Shirt - with scalar properties of ShirtID, ShirtName and ShirtPrice.   
           with navigation property to many Types (IEnumerable<Type>).   
B. Type - with scalar properties of TypeID and TypeName.   
          with navigation property to many Shirts (IEnumerable<Shirt>).  

Затем, после создания кода для ваших сущностей, вы можете сделать:

public ActionResult Browse(string tName)
        {
            using (TShopEntities db=new TShopEntities())
            {
                var typeModel = from s in db.Type
                                select Shirts;
                return View(typeModel.ToList());
            }
        }

И это все. Не стоит создавать другую сущность для ShirtType, потому что это неправильный способ создания вашей модели.

...