Я расширяю некоторый Linq до классов SQL. У меня есть 2 подобных оператора, 1-е работы, 2-е не делает ("не имеет никакого поддерживаемого перевода в SQL" ошибка).
var reg2 = rs.ProductRegistrations().SingleOrDefault(p => p.Product.product_name == "ACE")
var reg5 = rs.ProductRegistrations().SingleOrDefault(p => p.product_name == "ACE");
После чтения этой ссылки LINQ: Никакой Перевод в SQL
Я понимаю (я думаю), это в основном все должно быть "встроено", иначе дерево выражений не может быть вычислено правильно. 1-й пример непосредственно получает доступ к "продукту" LinqToSql EntitySet (сохраняющий все встроенное), тогда как 2-й пример использует свойство, которое определяется как это:
public partial class ProductRegistration :IProduct
{
public string product_name
{
get { return this.Product.product_name; }
}
}
Я предполагаю, что моя проблема состоит в том, что LinqToSql не может перевести это.
Как я повернул бы "свойство" в эквивалентный оператор? Я знаю, что должен использовать Систему. Linq. Выражения. Выражение, но все, что я попробовал, не работает (некоторые даже не компилируют). Возможно, я должен сделать Дополнительный метод (использующий Выражение) и затем назвать это от свойства? Свойство может назвать дополнительный метод??
Вещи как ниже не работают:
public static System.Linq.Expressions.Expression> ProductName2 (string pname)
{
return (p => p.product_name == pname);
}
Нижняя строка, я знаю, что должен перенести свой метод доступа в "Выражение <....>", но я не знаю, как получить доступ к этому от свойства, так, чтобы "reg5" переменная выше работала правильно.
Было бы большим, если бы был некоторый волшебный атрибут, что я мог просто добавить к свойству к "автовыражению" свойство и сделать LinqToSql счастливым, вместо того, чтобы перенести его в Выражение <...>
Хотел бы смочь сделать это...
public partial class ProductRegistration :IProduct
{
[Auto-Expression]
public string product_name
{
get { return this.Product.product_name; }
}
}
ОТРЕДАКТИРУЙТЕ ссылку и ответ ниже работ. Потрясающий, спасибо. 2-я часть моего вопроса, снова у меня есть 2 подобных оператора, 1-е работы, 2-е не делает ("не имеет никакого поддерживаемого перевода в SQL" ошибка).
var reg = rs.ProductRegistrations().ProductName("ACE").WithTranslations().SingleOrDefault();
var reg2 = rs.ProductRegistrations2().ProductName("ACE").WithTranslations().SingleOrDefault();
Различие в них - то, что 1-й возвращает IQueryable реального класса "IQueryable[ProductRegistration]", тогда как 2-й возвращает IQueryable интерфейса "IQueryable [IProduct]". Я хотел бы использовать 2-й, потому что я могу хлопнуть интерфейс через многие различные классы, и это более универсально тот путь, но это, кажется, не работает. Какие-либо идеи?
Было бы здорово, если бы был какой-то магический атрибут, который я мог бы просто добавить к свойству для "авто-выражения" свойства и осчастливить LinqToSql вместо завернув его в Expression <...>
Да, почти.Вам все равно придется проделать некоторую работу, но Damien Guard и друзья сделали за вас самую сложную часть: Свойства на стороне клиента и любой удаленный поставщик LINQ
Замечательно то, что работает с любым поставщиком LINQ, который поддерживает используемые вами выражения.
Обновление: Проблема с вашей второй версией (с интерфейсом) заключается в том, что поставщик Queryable должен иметь возможность выяснить, что является разработчиком интерфейса, потому что ему необходимо транслитерировать это в имя таблицы. . Но вся суть интерфейса в том, что пользователь интерфейса должен быть независимым от типа реализации, чтобы поставщик работал в перекрестных целях с интерфейсом. Так что я не думаю, что вторая форма сработает.