LINQ to Entity Relationship - PullRequest
       32

LINQ to Entity Relationship

1 голос
/ 16 марта 2012

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

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

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 не распознает метод метода 'Int32 getCategoryTypeID (Int32)', и этот метод нельзя преобразовать в выражение хранилища.

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

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

Ответы [ 4 ]

0 голосов
/ 16 марта 2012

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

int categoryTypeId = getCategoryTypeID(selectedId);

var categories = db.DataModel.Categories
    .Where(c => c.CategoryTypeID == categoryTypeId);
0 голосов
/ 16 марта 2012

По сути, эта ошибка говорит о том, что она не может преобразовать 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 голосов
/ 16 марта 2012

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

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

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

0 голосов
/ 16 марта 2012

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

...