Платформа объекта Расчетная проблема Свойства

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

Я создал частичный класс для расширения объекта объекта "Предложение" таким образом:

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

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

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

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

Число членов в концептуальном типе 'MyModelNamespace. Предложение' не соответствует числу членов на объектном типе стороны 'MyModelNamespace. Предложение'. Удостоверьтесь, что число членов является тем же.

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

9
задан tanathos 29 July 2010 в 14:16
поделиться

3 ответа

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

5
ответ дан 4 December 2019 в 23:38
поделиться

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

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

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

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

Думаю, есть лучший способ добиться того, что вы делаете.

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

1
ответ дан 4 December 2019 в 23:38
поделиться

Один из способов, который вы можете попробовать, - это использовать пространство имен 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, поэтому этот код может быть неправильным. Я открыт для исправлений.

0
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: