Проблема расчетного свойства Entity Framework - PullRequest
9 голосов
/ 29 июля 2010

У меня есть модель Entity Framework (v.1.0), которую я пытаюсь расширить с помощью вычисляемого свойства.

Я создал частичный класс для расширения объекта сущности «Предложение» в этомпуть:

namespace MyModelNamespace
{
    public partial class Offer
    {
        public bool MyProperty
        {
            get 
            {
                // my stuffs the return true or false
            }
        }
    }
}

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

_myEntities.OfferSet.FirstOrDefault(o=>o.MyProperty);

Я получаю эту ошибку:

Количество членов в концептуальном типе 'MyModelNamespace.Offer' не совпадает с количеством членов на стороне объекта типа 'MyModelNamespace.Offer'.Убедитесь, что количество членов одинаково.

... какие-либо предложения ???

Ответы [ 3 ]

5 голосов
/ 30 июля 2010

Да, вы можете сделать это. Используйте библиотеку переводов LINQ .

1 голос
/ 29 июля 2010

Вы не можете отправить пользовательские свойства в базу данных. Вы должны были получить что-то вроде

"Указанный элемент типа 'MyProperty' не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей."

Единственный действительный способ сделать то, что вы хотите, - это сохранить это в памяти. А затем фильтр.

   _myEntities.OfferSet.ToList().FirstOrDefault(o=>o.MyProperty);

Я предполагаю, что, возможно, есть лучший способ выполнить то, что вы делаете.

EDIT Я согласен, что у Крейга есть другой способ, если предположить, * что его можно перевести в выражение магазина. Если вы сопоставляете свойство с каким-либо типом запроса, вы сможете выполнить поиск / сбросить фильтр.

0 голосов
/ 30 июля 2010

Один из способов, который вы можете попробовать, это использовать пространство имен System.Linq.Expressions и метод расширения AsExpandable, доступный здесь .

Я думаю, вы могли бы передать выражение в метод FirstOrDefault, и если вы все еще хотите использовать MyProperty в другом месте, вы можете использовать это же выражение для вычисления его значения.Таким образом, у вас будет что-то вроде:

public partial class Offer
{
    public static Expression<Func<Offer, bool>> exp 
    {
        get
        {
            return o => o.Property1 * o.Property2 == someValue; 
        }
    }

    public bool MyProperty
    {
        get 
        {
            return exp.Compile()(this);
        }
    }
}

Затем вы передадите его:

_myEntities.OfferSet.AsExpandable().FirstOrDefault(Offer.exp.Compile()));

Если ваши вычисления можно преобразовать в дерево выражений, которое понимает SQL,думаю это сработает.Он работал с не-Entity тестовым классом, но использование его с LINQ to Entities - это другое животное.

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

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