powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
25 сообщений из 27, страница 1 из 2
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35129675
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем! Вопрос господину Гу и господину Зы, что делать если LINQ запрос сломался? Как его отладить? Раньше запускали SQl Profiller и без проблем! А теперь то что?
Проблема возникает в цепочка типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public IQueryable<mdm_DogovorAll> GetDogovorAll()
        {
            var query =
                   from c in this.Dogovor... select c;

            if (fOtborDoc["num"].active)
                query = (from c in query
                         where c.dg_num.Contains(fOtborDoc["dg_num"].value.ToString())
                         select c)
// и so on and so futh
}
Вроде работала в одной ситуации. Теперь вместо таблицы Dogovor view v_Dogovor и цепочка из deferred запросов даёт знакомое
Код: plaintext
Method 'otbor get_Item(System.String)' has no supported translation to SQL.
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35130008
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка исчезает если член класса fOtborDoc передать как параметр

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public IQueryable<mdm_DogovorAll> GetDogovorAll(OtborDoc fOtborDoc )
        {
            var query =
                   from c in this.Dogovor... select c;

            if (fOtborDoc["num"].active)
                query = (from c in query
                         where c.dg_num.Contains(fOtborDoc["dg_num"].value.ToString())
                         select c)
// и so on and so futh
}
Ошибка возникает в форме где результат используется
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 DataContext db;
 private void Form1_Load(object sender, EventArgs e)
        {
            db = new DataContext(DBConnection);           
            ReadDoc();

        }

         void ReadDoc()
        {
            var q = db.GetDogovorAlll(db.fOtborDoc);// передаём как параметр!!!
            HdrbindingSource.DataSource = q;

        }
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35130076
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что такое fOtborDoc? словарь, хитрый объект, ещё что-то?
сохрани fOtborDoc["dg_num"].value.ToString() в строковую переменную и используй её в вызове Contains

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

var query = this.Dogovor; // ?? db.Dogovor? ну ты блин и называть переменные и объекты
if(condition1==true)
query = query.Where(p=>p.dg_num.Contains(someValue));
if(condition2==true)
query = query.Where(p=>p.key==someValue2);

return query;
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35130340
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зычто такое fOtborDoc? словарь, хитрый объект, ещё что-то?

fOtborDoc - это экземпляр наследник словарика
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
OtborDoc  FOtborDoc = new OtborDoc ();
internal class otbor_field
    {
        public bool active { get; set; }
        public object value { get; set; }
        public object value1 { get; set; }
    }

    internal class OtborDoc : Dictionary<string, otbor_field>
{
internal OtborPrihNakl()
        {
            this.Add("dg_num", new otbor_field { active = false, value = "" });
}
}
зы

var query = this.Dogovor; // ?? db.Dogovor? ну ты блин и называть переменные и объекты
if(condition1==true)
query = query.Where(p=>p.dg_num.Contains(someValue));
if(condition2==true)
query = query.Where(p=>p.key==someValue2);

return query;

У меня достаточно передать FOtborDoc как параметр и всё работает, если как члену класса копец! Как это всё отлаживать? Присоединится к исходным текстам?
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35130428
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
старый способ через SQL Profiler все еще в почете. Кроме того, с LINQ есть два альтернативных пути:
1) после создания query можно поднести в дебаггере к нему мышку, и тебе отобразится SQL запрос
2) в DataContext есть свойство Log, можно ловить в коде все SQL запросы, которые шлются на скуль сервер, и писать их куда хочешь
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35130488
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы
var query = this.Dogovor; // ?? db.Dogovor? ну ты блин и называть переменные и объекты
if(condition1==true)
query = query.Where(p=>p.dg_num.Contains(someValue));
if(condition2==true)
query = query.Where(p=>p.key==someValue2);

return query;
db.Dogovor это таблица System.Data.Linq.Table<Dogovor>.
Так просто нельзя! Какой тип возврата return query? Это раз и опять обращение к словарику отборов как члену класса приводит к ошибке
Код: plaintext
Method 'otbor get_Item(System.String)' has no supported translation to SQL.
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35130548
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает если сохранить в локальные переменные

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
publick IQueryable<Dogovor> GetDogovorAll() {
  var query = from c in this.Dogovor
                        select c;
            string snum = fOtborDoc["dg_num"].value.ToString();

            if (fOtborDoc["dg_num"].active)
                query = (query.Where(c => c.dg_num.Contains(snum)));

return query ;
}
Как же все это объяснить товарищь Зы?
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35130675
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great Работает если сохранить в локальные переменные

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
publick IQueryable<Dogovor> GetDogovorAll() {
  var query = from c in this.Dogovor
                        select c;
            string snum = fOtborDoc["dg_num"].value.ToString();

            if (fOtborDoc["dg_num"].active)
                query = (query.Where(c => c.dg_num.Contains(snum)));

return query ;
}
Как же все это объяснить товарищь Зы?
не знаю, у меня все работает. В твоем кривом коде неудивительно что что-то может не работать. Вообще DLINQ анализирует выражение и пытаетася преобразовать его в SQL запрос, это не очень тривиальная задача, возможно что-то ты перемудрил со своим классом и ему не нравится. У тебя RTM?

Кстати замени эту галиматью
Код: plaintext
1.
 var query = from c in this.Dogovor
                        select c;
на
Код: plaintext
var query = db.Dogovor.AsQueryable();
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35130957
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы
не знаю, у меня все работает. В твоем кривом коде неудивительно что что-то может не работать. Вообще DLINQ анализирует выражение и пытаетася преобразовать его в SQL запрос, это не очень тривиальная задача, возможно что-то ты перемудрил со своим классом и ему не нравится. У тебя RTM?

Кстати замени эту галиматью
Код: plaintext
1.
 var query = from c in this.Dogovor
                        select c;
на
Код: plaintext
var query = db.Dogovor.AsQueryable();


У меня RTM только что присланная в Москву
Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5
Microsoft Visual C# 2008 91899-270-9028817-60340
Microsoft Visual Studio Team System 2008 Development Edition 91899-270-9028817-60340

ты всегда сохраняешь в локальные переменные? К этому надо привыкнуть.
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35131069
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не всегда сохраняю в локальные переменные, у меня просто почему-то нет таких ужасных конструкций :) попробовал воспроизвести твою, разве что только класс свой наследованием не создавал - все работало
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35131146
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыя не всегда сохраняю в локальные переменные, у меня просто почему-то нет таких ужасных конструкций :) попробовал воспроизвести твою, разве что только класс свой наследованием не создавал - все работало
К сожалению работает vs не работает зависит от мелочей :-))) Важно что словарик отбора член класса DataContext. То что текст длинный - отбор по всем полям. Чего тут ужасного?
Да конечно можно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  
var query = this.Вщпщмщк.AsQueryable();
             
            if (fOtborPrihNakl["dg_num"].active)
                query = (query.Where(c => c.dg_num.Contains(snum)));


            if (fOtborPrihNakl["dg_date"].active)
                query = query.Where(c => c.pn_date >= d1 && c.pn_date <= d2);

            return query;
Чего тут ужасного? А как бы ты реализовал отборы колонкам таблицы?
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35131162
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill GreatЧего тут ужасного?
Индексация строковыми литералами, fOtborPrihNakl, dg_num, Dogovor, fOtborDoc.
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35131195
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill GreatА как бы ты реализовал отборы колонкам таблицы?
1) создал бы статический список предикатов: ключ в колонке - предикат
2) написал бы итератор
Код: plaintext
1.
2.
3.
foreach(var col in columns) {
   if(col.Active)
       query = query.Where(_expressions[col.Name](col.Value));
}
о создании предикатов выражений пару недель назад разжевывалось на форуме по LINQ: http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=123&SiteID=1
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35132396
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы Bill GreatА как бы ты реализовал отборы колонкам таблицы?
1) создал бы статический список предикатов: ключ в колонке - предикат
2) написал бы итератор
Код: plaintext
foreach(var col in columns) {\n   if(col.Active)\n       query = query.Where(_expressions[col.Name](col.Value));\n}
о создании предикатов выражений пару недель назад разжевывалось на форуме по LINQ: http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=123&SiteID=1
Hah! Но так НЕ РАБОТАЕТ!!!!! Нельзя писать внeтри foreach!!!! Смотри свои же умные объяснения. Я создал максимально короткий НЕРАБОТАЮЩИЙ пример, каждый может проверить! См. новый тему!
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35132893
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great
Hah! Но так НЕ РАБОТАЕТ!!!!! Нельзя писать внeтри foreach!!!! Смотри свои же умные объяснения.
не ори если не знаешь. Как у меня написано работать будет. Почему - домашнее задание на сообразительность.
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35133343
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great зы
1) создал бы статический список предикатов: ключ в колонке - предикат
2) написал бы итератор
Код: plaintext
foreach(var col in columns) {\n   if(col.Active)\n       query = query.Where(_expressions[col.Name](col.Value));\n}
о создании предикатов выражений пару недель назад разжевывалось на форуме по LINQ: http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=123&SiteID=1
Hah! Но так НЕ РАБОТАЕТ!!!!! Нельзя писать внeтри foreach!!!! Смотри свои же умные объяснения. Я создал максимально короткий НЕРАБОТАЮЩИЙ пример, каждый может проверить! См. новый тему!
зная что ничерта ты не найдешь и не напишешь, решил сам потренироваться на практике. Вот тебе ниже работающий пример для примерно твоего контекста. Наверняка можно и лучше написать, но основная идея должна быть понятна

Код: plaintext
\nclass Person\n{\n\tpublic string FirstName { get; set; }\n\tpublic string LastName { get; set; }\n\tpublic string Position { get; set; }\n}\n\nstatic List<Person> _persons = new List<Person>() {\n\tnew Person() { FirstName = "Ivan", LastName="Ivanov", Position="Manager" },\n\tnew Person() { FirstName = "Maxim", LastName="Ivanov", Position="Employee" },\n\tnew Person() { FirstName = "Maxim", LastName="Petrov", Position="Employee" }\n};\n\nstatic Dictionary<string, Func<object, Func<Person, bool>>> expressions = \n\tnew Dictionary<string, Func<object, Func<Person, bool>>>() \n{\n\t{"first", (p) => ((a) => a.FirstName == p.ToString())},\n\t{"last", (p) => ((a) => a.LastName == p.ToString())},\n\t{"position", (p) => ((a) => a.Position == p.ToString())}\n};\n\nstatic void TestExpressions()\n{\n\n\tvar conditions = new[] {\n\t\tnew { Field = "last", Value = "Ivanov" },\n\t\tnew { Field = "position", Value = "Employee" }\n\t};\n\n\tvar q = _persons.AsEnumerable();\n\tforeach (var cond in conditions)\n\t{\n\t\tq = q.Where(expressions[cond.Field](cond.Value));\n\t}\n\tforeach (var res in q)\n\t{\n\t\tConsole.WriteLine("{0} {1} - {2}", res.FirstName, res.LastName, res.Position);\n\t}\n\tConsole.ReadKey();\n}\n

на linq форумах как-то вроде иначе предлагали сделать, сейчас не нашел ссылку. Но это тоже работает нормально :)
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35133355
зына linq форумах...
господа, может вы туда и пойдете строем ставить опыты на себе?..
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35133437
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господин Гу зына linq форумах...
господа, может вы туда и пойдете строем ставить опыты на себе?..
твой мозг не выдерживает синтаксис? :) не читай
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35133460
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы
зная что ничерта ты не найдешь и не напишешь, решил сам потренироваться на практике. Вот тебе ниже работающий пример для примерно твоего контекста. Наверняка можно и лучше написать, но основная идея должна быть понятна

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class Person
{
	public string FirstName { get; set; }
	public string LastName { get; set; }
	public string Position { get; set; }
}

static List<Person> _persons = new List<Person>() {
	new Person() { FirstName = "Ivan", LastName="Ivanov", Position="Manager" },
	new Person() { FirstName = "Maxim", LastName="Ivanov", Position="Employee" },
	new Person() { FirstName = "Maxim", LastName="Petrov", Position="Employee" }
};

static Dictionary<string, Func<object, Func<Person, bool>>> expressions = 
	new Dictionary<string, Func<object, Func<Person, bool>>>() 
{
	{"first", (p) => ((a) => a.FirstName == p.ToString())},
	{"last", (p) => ((a) => a.LastName == p.ToString())},
	{"position", (p) => ((a) => a.Position == p.ToString())}
};




Идею понял, ты имярек, забыл про активность. Чуть позже попробую!
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35133472
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great
ты имярек, забыл про активность
а теперь по-русски, слабо? причем тут активность?
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35133773
зытвой мозг не выдерживает синтаксис? :) не читай
прикупите себе вменяемого архитектора и лет через 5 он разрешит вам потрогать это руками. если оно выживет.
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35133786
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы Bill Great
ты имярек, забыл про активность
а теперь по-русски, слабо? причем тут активность?
Твой вопрос говорит о том что я не на того подумал.
Отбор может быть активен или нет в зависимости от этого он участвует в выражении или нет. идея красивая. То что я вкладывал были примеры а не рабочий код. Конечно словарик это слишком примитивно. Сейчас применю на практике.
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35133799
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господин Гу
прикупите себе вменяемого архитектора и лет через 5 он разрешит вам потрогать это руками. если оно выживет.
ну mashup покритиковать всегда приветствуется, только желательно конечно конкретно :)
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35134015
... сказала лабораторная мышь
субж вышел 3 месяца назад. какая критика, его еще просто НЕТ
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35134254
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откуда только берутся такие любители пукнуть в воздух? ааа, понял, тебе твой архитектор только-только дал потрогать .net 1.1, вот ты и рад до безумия :) ну что ж, осваивай, береги ручки для новых ископаемых :)
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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