1

Привет, я являюсь Entity Framework newb, и я пытаюсь получить следующий код в одном запросе для отношения данных. Отношения являются одними для многих.LINQ to Entity Relationship

Код, который не работает:

var categories = db.DataModel.Categories 
    .Where(c => c.CategoryTypeID == getCategoryTypeID(selectedId)); 

int getCategoryTypeID(int selectedTypeId) 
{ 
    return db.DataModel.CategoryLinkTypes.Where(l => l.ID == selectedTypeId) 
     .FirstOrDefault().ToInt(0); 
} 

Я надеюсь, что вы можете увидеть, что я пытаюсь сделать. Когда я запускаю этот код, я получаю эту ошибку:

LINQ to Entities does not recognize the method 'Int32 getCategoryTypeID(Int32)' method, and this method cannot be translated into a store expression.

Может ли кто-нибудь показать мне правильный способ сделать это?

Я использую EF 4 + и C#

ответ

0

Вы можете попробовать вытягивать вашу функцию из запроса ссылки:

int categoryTypeId = getCategoryTypeID(selectedId); 

var categories = db.DataModel.Categories 
    .Where(c => c.CategoryTypeID == categoryTypeId); 
+0

Рад, что это сработало для вас. Просто из любопытства, с которым вы столкнулись? –

+0

Я использовал второй вариант только потому, что оказалось, что у меня было более одного объекта, с которым я имел дело в своих отношениях. Так что это была всего одна таблица к другой. Спасибо за вашу помощь! – Jared

+0

Имеет смысл - первый вариант был фактически испорчен. Он вернул бы IEnumerable >. Я просто собираюсь удалить его для ясности. –

0

Вы не можете по-прежнему вызывать такую ​​функцию, что в запросе. Но вы должны иметь возможность извлечь логику в функцию, сделать ее выражением и использовать ее внутри запроса. Надеюсь, это понятно.

+0

Здравствуйте, как это? var categories = db.DataModel.Categories.Where (c => c.CategoryTypeID == db.DataModel.CategoryLinkTypes.Where (l => l.ID == selectedTypeId) .FirstOrDefault(). ToInt (0)); – Jared

0

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

Вариант должен состоять из JOIN двух таблиц и запускать вас непосредственно против CategoryLinkTypes.

Другим вариантом было бы изменить функцию, чтобы вернуть Queryable, но я думаю, что JOIN может быть проще в этом случае

Пример JOIN (я считаю, что это должно работать :)):

db.DataModel.Categories 
    .Join(
     db.DataModel.CategoryLinkTypes, //What you are joining 
     category=>category.CategoryTypeID, //Right Side 
     categoryLinkType=>categoryLinkType.CategoryTypeID, //Left Side 
     (category, categoryLinkType) => //Creation of new, combined object 
      new{LinkTypeId = categoryLinkType.Id, 
       Category = category} 
    ) 
    .Where(x=>x.LinkTypeId == selectedId) 
    .Select(x=>x.Category); //We only want the Category 
+0

Можете ли вы показать мне пример JOIN? Использует ли это .Include («X»)? – Jared

+0

Include больше подходит для переопределения ленивой загрузки. Join - это то, что будет использоваться для создания вашего запроса в конце. Я обновил свой пример –

0

Предполагая, что вы правильно настроили базу данных с помощью внешних ключей, а затем создали свойства навигации. Вы должны быть в состоянии сделать что-то вроде этого (так как я не могу видеть фактическую модель данных, я просто догадки, но вы должны получить представление)

var categories = db.DataModel.Categories 
    .Where(c => c.CategoryType.CategoryLinkTypeID == SelectedTypeID); 

Если вы должны были изменить свой вопрос, и включают в себя определения категорий и объектов типа Category, которые могут помочь.