powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
27 сообщений из 27, показаны все 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
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35134818
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы
зная что ничерта ты не найдешь и не напишешь, решил сам потренироваться на практике. Вот тебе ниже работающий пример для примерно твоего контекста. Наверняка можно и лучше написать, но основная идея должна быть понятна

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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())}
};


Удивительное открытие - эта штука фильтрует на клиенте! Делаем Customer словарик выражений фильтрации
Код: plaintext
1.
2.
3.
4.
5.
6.
 Dictionary<string, Func<object, Func<Customer, bool>>> filterExpressions =
    new Dictionary<string, Func<object, Func<Customer, bool>>>() 
{
	{"CompanyName", (p) => ((customer) => customer.CompanyName.Contains( p.ToString()))},
	{"ContactName", (p) => ((customer) => customer.ContactName.Contains(p.ToString()))},
	{"Country", (p) => ((customer) => customer.Country.Contains( p.ToString()))}
};
создаём фильтр
Код: plaintext
1.
2.
3.
4.
var conditions = new[]{
                new {field ="CompanyName", value="Ch"},
                  new {field ="Country", value="n"}
            }

Фильтруем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  

            foreach (var cond in conditions)
            {
                query = query.Where(filterExpressions[cond.field](cond.value));

            }
            bindingSource1.DataSource = query;
Смотрим в SQL Propfiler и о УЖОС! Запрос на сервере без where!!!
...
Рейтинг: 0 / 0
LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
    #35136138
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блииин, какой же ты нафиг утомительный. А подумать, поразмыслить мозгом? не умеем? Смотри за моей левой рукой - я добавил одно слово и поменял второе:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
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, Expression<Func<Person, bool>>>> expressions = 
	new Dictionary<string, Func<object, Expression<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 = "first", Value = "Maxim" },
		new { Field = "position", Value = "Employee" }
	};

	var q = _persons.AsQueryable();
	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();
}
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ-Вопрос господину Гу и господину Зы: "Что делать если всё плохо?"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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