Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
Привет всем! Вопрос господину Гу и господину Зы, что делать если LINQ запрос сломался? Как его отладить? Раньше запускали SQl Profiller и без проблем! А теперь то что?
Проблема возникает в цепочка типа
 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 запросов даёт знакомое
Method 'otbor get_Item(System.String)' has no supported translation to SQL.
13 фев 08, 12:54    [5283249]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
Ошибка исчезает если член класса fOtborDoc передать как параметр

 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
}
Ошибка возникает в форме где результат используется
 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;

        }
13 фев 08, 14:15    [5284010]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
что такое 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;
13 фев 08, 14:31    [5284167]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
зы
что такое fOtborDoc? словарь, хитрый объект, ещё что-то?

fOtborDoc - это экземпляр наследник словарика
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 как параметр и всё работает, если как члену класса копец! Как это всё отлаживать? Присоединится к исходным текстам?
13 фев 08, 15:25    [5284734]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
старый способ через SQL Profiler все еще в почете. Кроме того, с LINQ есть два альтернативных пути:
1) после создания query можно поднести в дебаггере к нему мышку, и тебе отобразится SQL запрос
2) в DataContext есть свойство Log, можно ловить в коде все SQL запросы, которые шлются на скуль сервер, и писать их куда хочешь
13 фев 08, 15:42    [5284901]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
зы

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? Это раз и опять обращение к словарику отборов как члену класса приводит к ошибке
Method 'otbor get_Item(System.String)' has no supported translation to SQL.
13 фев 08, 15:52    [5285004]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
Работает если сохранить в локальные переменные

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 ;
}
Как же все это объяснить товарищь Зы?
13 фев 08, 16:06    [5285113]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
Bill Great
Работает если сохранить в локальные переменные

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?

Кстати замени эту галиматью
 var query = from c in this.Dogovor
                        select c;
на
var query = db.Dogovor.AsQueryable();
13 фев 08, 16:49    [5285490]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
зы

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

Кстати замени эту галиматью
 var query = from c in this.Dogovor
                        select c;
на
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

ты всегда сохраняешь в локальные переменные? К этому надо привыкнуть.
13 фев 08, 18:16    [5286186]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
я не всегда сохраняю в локальные переменные, у меня просто почему-то нет таких ужасных конструкций :) попробовал воспроизвести твою, разве что только класс свой наследованием не создавал - все работало
13 фев 08, 19:06    [5286439]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
зы
я не всегда сохраняю в локальные переменные, у меня просто почему-то нет таких ужасных конструкций :) попробовал воспроизвести твою, разве что только класс свой наследованием не создавал - все работало

К сожалению работает vs не работает зависит от мелочей :-))) Важно что словарик отбора член класса DataContext. То что текст длинный - отбор по всем полям. Чего тут ужасного?
Да конечно можно так
  
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;
Чего тут ужасного? А как бы ты реализовал отборы колонкам таблицы?
13 фев 08, 20:03    [5286622]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Нахлобуч
Member

Откуда: https://hglabhq.com
Сообщений: 3939
Bill Great
Чего тут ужасного?

Индексация строковыми литералами, fOtborPrihNakl, dg_num, Dogovor, fOtborDoc.
13 фев 08, 20:12    [5286653]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
Bill Great
А как бы ты реализовал отборы колонкам таблицы?

1) создал бы статический список предикатов: ключ в колонке - предикат
2) написал бы итератор
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
13 фев 08, 20:36    [5286729]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
зы
Bill Great
А как бы ты реализовал отборы колонкам таблицы?

1) создал бы статический список предикатов: ключ в колонке - предикат
2) написал бы итератор
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

Hah! Но так НЕ РАБОТАЕТ!!!!! Нельзя писать внeтри foreach!!!! Смотри свои же умные объяснения. Я создал максимально короткий НЕРАБОТАЮЩИЙ пример, каждый может проверить! См. новый тему!
14 фев 08, 12:38    [5289596]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
Bill Great

Hah! Но так НЕ РАБОТАЕТ!!!!! Нельзя писать внeтри foreach!!!! Смотри свои же умные объяснения.

не ори если не знаешь. Как у меня написано работать будет. Почему - домашнее задание на сообразительность.
14 фев 08, 14:32    [5290715]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
Bill Great
зы

1) создал бы статический список предикатов: ключ в колонке - предикат
2) написал бы итератор
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

Hah! Но так НЕ РАБОТАЕТ!!!!! Нельзя писать внeтри foreach!!!! Смотри свои же умные объяснения. Я создал максимально короткий НЕРАБОТАЮЩИЙ пример, каждый может проверить! См. новый тему!

зная что ничерта ты не найдешь и не напишешь, решил сам потренироваться на практике. Вот тебе ниже работающий пример для примерно твоего контекста. Наверняка можно и лучше написать, но основная идея должна быть понятна

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())}
};

static void TestExpressions()
{

	var conditions = new[] {
		new { Field = "last", Value = "Ivanov" },
		new { Field = "position", Value = "Employee" }
	};

	var q = _persons.AsEnumerable();
	foreach (var cond in conditions)
	{
		q = q.Where(expressions[cond.Field](cond.Value));
	}
	foreach (var res in q)
	{
		Console.WriteLine("{0} {1} - {2}", res.FirstName, res.LastName, res.Position);
	}
	Console.ReadKey();
}

на linq форумах как-то вроде иначе предлагали сделать, сейчас не нашел ссылку. Но это тоже работает нормально :)
14 фев 08, 16:02    [5291636]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
господин Гу
Guest
зы
на linq форумах...

господа, может вы туда и пойдете строем ставить опыты на себе?..
14 фев 08, 16:05    [5291673]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
господин Гу
зы
на linq форумах...

господа, может вы туда и пойдете строем ставить опыты на себе?..

твой мозг не выдерживает синтаксис? :) не читай
14 фев 08, 16:27    [5291893]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
зы

зная что ничерта ты не найдешь и не напишешь, решил сам потренироваться на практике. Вот тебе ниже работающий пример для примерно твоего контекста. Наверняка можно и лучше написать, но основная идея должна быть понятна

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())}
};




Идею понял, ты имярек, забыл про активность. Чуть позже попробую!
14 фев 08, 16:31    [5291933]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
Bill Great

ты имярек, забыл про активность

а теперь по-русски, слабо? причем тут активность?
14 фев 08, 16:35    [5291960]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
господин Гу
Guest
зы
твой мозг не выдерживает синтаксис? :) не читай

прикупите себе вменяемого архитектора и лет через 5 он разрешит вам потрогать это руками. если оно выживет.
14 фев 08, 17:50    [5292527]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
Bill Great
Member

Откуда: Москва
Сообщений: 883
зы
Bill Great

ты имярек, забыл про активность

а теперь по-русски, слабо? причем тут активность?

Твой вопрос говорит о том что я не на того подумал.
Отбор может быть активен или нет в зависимости от этого он участвует в выражении или нет. идея красивая. То что я вкладывал были примеры а не рабочий код. Конечно словарик это слишком примитивно. Сейчас применю на практике.
14 фев 08, 17:52    [5292552]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
господин Гу

прикупите себе вменяемого архитектора и лет через 5 он разрешит вам потрогать это руками. если оно выживет.

ну mashup покритиковать всегда приветствуется, только желательно конечно конкретно :)
14 фев 08, 17:58    [5292593]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
господин Гу
Guest
... сказала лабораторная мышь
субж вышел 3 месяца назад. какая критика, его еще просто НЕТ
14 фев 08, 19:32    [5293010]     Ответить | Цитировать Сообщить модератору
 Re: LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"  [new]
зы
Guest
откуда только берутся такие любители пукнуть в воздух? ааа, понял, тебе твой архитектор только-только дал потрогать .net 1.1, вот ты и рад до безумия :) ну что ж, осваивай, береги ручки для новых ископаемых :)
14 фев 08, 22:54    [5293432]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить