У меня есть модель (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. Предложение'. Удостоверьтесь, что число членов является тем же.
... какие-либо предложения???
Да, вы можете это сделать. Используйте библиотеку переводов LINQ .
Вы не можете передать настраиваемые свойства в базу данных. Вы должны были получить что-то вроде
«Указанный член типа MyProperty не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности».
Единственный допустимый способ делать то, что вы хочу, чтобы это было в памяти. А потом фильтруйте.
_myEntities.OfferSet.ToList().FirstOrDefault(o=>o.MyProperty);
Думаю, есть лучший способ добиться того, что вы делаете.
ИЗМЕНИТЬ Я согласен, Крейг, есть другой способ, при условии, что * его можно перевести в выражение store. Если вы сопоставляете свойство с каким-либо типом запроса, вы сможете выполнить поиск / сдвинуть фильтр вниз.
Один из способов, который вы можете попробовать, - это использовать пространство имен 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, поэтому этот код может быть неправильным. Я открыт для исправлений.