powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ2SQL: рефлексия vs. трансляция выражений
15 сообщений из 15, страница 1 из 1
LINQ2SQL: рефлексия vs. трансляция выражений
    #36737484
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди добрые, подскажите...

Допустим, для примера, имеется БД с таблицами, в которых строки не удаляются, а помечаются на удаление флагом isDeleted . Скажем, тривиальная выборка для таблицы с именем Table будет выглядеть:
Код: plaintext
1.
2.
from t in db.Tables
where t.isDeleted == false
select t;

Для того чтобы не повторять однотипный код, отличающийся только наименованием сущностного класса, для всех организованных подобным образом таблиц БД, попытался применить рефлексию. Тогда приведенный запрос будет выглядеть следующим образом:
Код: plaintext
1.
db.GetType().GetProperty(name).GetValue(db, null) as IQueryable<Object>)
.Where(o => (bool)(o.GetType().GetProperty("isDeleted").GetValue(o, null)) == false)
где name - имя таблицы
Однако возникает исключение:
Код: plaintext
Method 'System.Reflection.PropertyInfo GetProperty(System.String)' has no supported translation to SQL.

Не уверен, верна ли задумка...можно ли как то заставить движок понять, что по сути обращение происходит к свойству, помеченному атрибутом ColumnAttribute, класса, помеченного атрибутом TableAttribute, на основе которого и происходит привязка к колонке БД, а следовательно не пытаться транслировать саму рефлексию в sql-запрос.
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36737512
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем случае, возможно ли при помощи рефлексии составлять LINQ запросы к любой таблице, помещая в выражение where обращение к любому полю?
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36737650
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dynamic LINQ ?
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36737659
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, что-то подобное...
Ухожу, конечно, от их концепции, мол, для каждой таблицы свой класс, у каждого свои свойства, все именовано, удобно....
ан нет, хочется один запрос сразу для всех таблиц (хотя бы тривиальных задач, которые все равно возникают)
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36737670
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, прочитал, кажется понял, что все просто)))
Ща пойду проверять, так ли понял, спасибо!!!!
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36737697
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, вообще, для такой задачи не стоит юзать динамик. Посмотрите в сторону обычного ООП:

Код: plaintext
1.
2.
3.
4.
5.
6.
List<Foo1> list1 = new List<Foo1>();
List<Foo2> list2 = new List<Foo2>();

// ...

var result1 = list1.Where(GetPredicate(true));
var result2 = list2.Where(GetPredicate(false));

GetPredicate
Код: plaintext
1.
2.
3.
4.
public Func<IFoo, bool> GetPredicate(bool input)
{
    Func<IFoo, bool> predicate = d => d.IsDeleted == input;
    return predicate;
}


IFoo's
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public interface IFoo
{
    bool IsDeleted { get; set; }
}

public class Foo1 : IFoo
{
    public bool IsDeleted { get; set; }
    public int MyFoo1Property { get; set; }
}

public class Foo2 : IFoo 
{
    public bool IsDeleted { get; set; }
    public string MyFoo2Property { get; set; }
}
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36737749
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
..другими словами, определить, например, интерфейс со свойствами, совпадающими именами с соответствующими свойствами сущностных классов...
Ща опробую)))...
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36737799
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал, все работает!!!
Остановился на последнем варианте, dynamic трогать не стал...
P.S.: круто, ппля
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36738919
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такое решение, если речь идет не о конкретном поле, а, например, о первичном ключе, в общем случае, применить не получается...
Ключи по-разному именуются, ключ может быть составной...
Опять же при помощи рефлексии можно выяснить, какие поля являются ключевыми (через ColumnAttribute), однако рефлексия не транслируется в sql...
...Странно, что нет очевидного способа добраться к ключевым полям...в том же DataSet'e все просто...
При такой постановке задачи, что остается? Dynamic?
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36738961
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
horghТакое решение, если речь идет не о конкретном поле, а, например, о первичном ключе, в общем случае, применить не получается...
Внимательно перечитайте свой начальный вопрос:

horghДля того чтобы не повторять однотипный код, отличающийся только наименованием сущностного класса , для всех организованных подобным образом таблиц БД, попытался применить рефлексию.

... и определитесь, наконец, что Вам нужно. Шашечки, ехать или ползти.

horghПри такой постановке задачи, что остается? Dynamic?
Да.
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36739692
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУВнимательно перечитайте свой начальный вопрос:

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

МСУ
horghПри такой постановке задачи, что остается? Dynamic?

Да.

За ответ спасибо, буду думать в эту сторону...
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36739932
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя думает, что Вы выбрали не тот инструмент (ORM). Используйте классические IDbCommand's и оперируйте динамически запросами и условиями.
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36739979
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
))К сожалению, прямо в точку!...
Однако ж, тогда для каких задач целесообразно использовать Linq2SQL?
Там где нет необходимости в "общем", а "частное" более чем достаточно?
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36739984
horgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для решения каких задач все же эффективно использовать LINQ2SQL?
А не как у меня получается: LINQ2SQL ради LINQ2SQL...
...
Рейтинг: 0 / 0
LINQ2SQL: рефлексия vs. трансляция выражений
    #36740274
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте вообще саму концепцию ORM и сделайте выводы.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ2SQL: рефлексия vs. трансляция выражений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]