6
I Use This!
Activity Not Available

News

Analyzed 3 months ago. based on code collected 4 months ago.
Posted about 6 years ago by Слава
Здравствуйте, IT, Вы писали: IT>Там же написано, что должно быть 151K после налогов в одно рыло. IT>А ты даёшь ссылку на семью, как минимум из 2-х человек. Я прошу прощения за оффтопик, но вас очень редко можно встретить на форуме ... [More] , а у меня к вам вопрос, причём я даже затрудняюсь его полностью сформулировть. Я хочу сделать нечто вроде linq2db для DynamoDB. Но, для этого нужно транслировать ExpressionTree в сам запрос, а проблема в том, что выражения DynamoDB поддерживают далеко не все операции linq. SQL гораздо более полный. То есть, чтобы не дать программисту написать выражение, которое не может быть скомпилировано в запрос, нужно видимо писать набор своих операций, подобных linq. Но ведь для IQueryable (потомка IEnumerable) определено множество методов linq, и соответственно, при использовании IQueryable нельзя гарантировать, что будут использованы только разрешенные в DynamoDB операции. Что же с этим делать, создавать своего потомка IEnumerable? Так тоже не пойдёт, ведь всегда можно привести гипотетический IDynamoQueryable к IEnumerable и вызвать неподдерживаемую операцию. Что бы вы порекомендовали? 11.05.19 00:19: Ветка выделена из темы неужели успешный программист в штатах входит в 1% самыхАвтор: xmaДата: 07.05 17:31 — IT [Less]
Posted about 6 years ago by FireShock
Когда генерируется контекст БД t4-шаблоном, то в комментарии к нему (в summary) добавляются Database, Data Source, Server Version. Есть ли возможность удалить Server Version или подставлять фейковое значение?
Posted over 6 years ago by dmitry_npi
Добрый день. Прочитал на сайте про долго- и короткоживущие соединения, но так и не смог определиться, что мне использовать, DataConnection или DataContext. Я бы хотел унаследовать свой класс от одного из них и использовать в стиле Entity ... [More] Framework: using(var db = new MyDatabase()) // 1 { db.Insert(new Customer()); // 2 db.Insert(new Customer()); // 3 } // 4 Вопросы: 1) В какой точке происходит открытие реального соединения с БД? 2) В какой точке записи реально попадут в БД: в момент вызова Insert или после конца блока using? 2a) Как отличается это поведение между DataConnection и DataContext? Спасибо. [Less]
Posted over 6 years ago by Basker
Доброго времени суток! Помогите с запросом к БД. Торможу и не могу понять как это написать. Есть таблица TProcesses с данными: ---------------------------------------------- | ID | Name | Denotation | NoTech | Version | ... [More] ---------------------------------------------- | 1 | Test1 | T1 | T1TP | 1 | | 1 | Test1 | T1 | T1TP | 2 | | 2 | Test2 | T2 | T1TP | 1 | | 2 | Test2 | T2 | T2TP | 2 | | 2 | Test2 | T2 | T2TP | 3 | ---------------------------------------------- Надо вытащить следующие данные в List: 1 | Test1 | T1 | T1TP | 2 2 | Test2 | T2 | T2TP | 3 SQL-запрос простейший: SELECT ID, Name, Denotation, NoTech, MAX(Version) AS Version FROM TProcesses GROUP BY ID, Name, Denotation, NoTech ORDER BY Denotation, NoTech Как это записать в Linq2Db не соображу. Как оставить одну строку с максимальной версией для каждого ID? [Less]
Posted over 6 years ago by FireShock
Привет. from t1 in _db.table1 join t2 in _db.table2 on t1.f1 equals t2.f1 select ... Есть ли возможность преобразовать этот JOIN в INNER MERGE JOIN в T-SQL? Чтобы было так: ... FROM [dbo].[Table1] [t1] INNER MERGE JOIN [dbo].[Table2] [t2] ON [t2].[f1] = [t1].[f1] ...
Posted almost 7 years ago by _NN_
Я пока только начал разбираться с LINQ2DB. Неясен момент с миграциями БД. Насколько я понимаю после изменения структуры БД, нужно вручную написать миграцию, так ? Получается, что можно легко ошибиться при написании миграции вручную. Или есть какой-нибудь более надёжный способ ?
Posted almost 7 years ago by STDray
Привет! Можно ли как-то средствами linq2db (sqlserver) сделать вставку из одной базы в другую в рамках одного сервера? Пока думаю, притянуть необходимые мне таблицы в виде вьюх из базы-источника в целевую БД и там уже из них писать ... [More] select'ы. Тут еще важно, чтобы запрос получился server side, без прокачивания данных через клиента. Если очевидный способ есть, то я пока его не вижу. [Less]
Posted almost 7 years ago by STDray
Привет! Есть, например, вот такой искусственный запрос from cla in P2P_CALCULATED_CESSION_LOAN_ACCRUE let cessionStartPlus2 = cla.CessionStart.AddDays(2) let x = P2P_CALCULATED_CESSION_LOAN_ACCRUE.Sum(y => y.InvestorInterest) select ... [More] new { Y1 = x < 0 ? 9 : x + 8, Y2 = Math.Round(x + x) }; он раскрывается вот портянку, где вычисление x будет повторено несколько раз SELECT CASE WHEN ( SELECT Sum([t1].[InvestorInterest]) FROM [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE] [t1] ) < 0 THEN 9 ELSE ( SELECT Sum([t1].[InvestorInterest]) FROM [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE] [t1] ) + 8 END as [c2], ( SELECT Sum([t2].[InvestorInterest]) FROM [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE] [t2] ) as [c4] FROM [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE] [t3] Есть ли какой-то способ вместо прямой подстановки сгенерировать запрос с внешним select? Что-то вроде такого select CASE WHEN t1.x < 0 THEN 9 ELSE t1.x + 8 END as [c2], Round(t1.x + t1.x, 2) as [c4] from (SELECT Sum([InvestorInterest]) as x FROM [dbo].[P2P_CALCULATED_CESSION_LOAN_ACCRUE]) [t1] Может как-то руками можно указать, что в данном случае надо x не раскрывать, а один раз вычислить и дальше оборачивать внещними селектами? [Less]
Posted almost 7 years ago by Петрухин Эдуард
Версия 2.2, MS SQL Server 2016 Есть две таблицы: [Table("Authors")] public class Author { [PrimaryKey, Identity] public int Id { get; set; } [Column(CanBeNull = false)] public string Name { get; set; } } [Table("Books")] ... [More] public class Book { [PrimaryKey, Identity] public int Id { get; set; } [Column(CanBeNull = false)] public int AuthorId { get; set; } [Column(CanBeNull = false)] public string Title { get; set; } } Обращение к ним идёт через две переменные: var authors = db.GetTable(); var books = db.GetTable(); Запрос from author in authors let booksCount = ( from book in books where book.AuthorId == author.Id select Sql.Ext.Count(book.Id).ToValue() ).Single() where booksCount > 42 select new { author.Name, BooksCount = booksCount } генерирует следующий SQL код: SELECT [t3].[Name], [t2].[c1] as [c11], [t2].[c2] as [c21] FROM [Authors] [t3] OUTER APPLY ( SELECT COUNT([t1].[Id]) as [c1], 1 as [c2] FROM [Books] [t1] WHERE [t1].[AuthorId] = [t3].[Id] ) [t2] WHERE ( SELECT COUNT([t4].[Id]) FROM [Books] [t4] WHERE [t4].[AuthorId] = [t3].[Id] ) > 42 Запрос получается неестественный и, возможно, не оптимальный. Запрос from author in authors let booksAgg = ( from book in books where book.AuthorId == author.Id select new { Count = Sql.Ext.Count(book.Id).ToValue() } ).Single() where booksAgg.Count > 42 select new { author.Name, BooksCount = booksAgg.Count } падает: LinqToDB.Linq.LinqException: 'Table([Books]).Where(book => (book.AuthorId == <>h__TransparentIdentifier0.author.Id)).Select(book => new <>f__AnonymousType5`1(Count = Sql.Ext.Count(book.Id).ToValue())).Single().Count' cannot be converted to SQL. at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertToSql(IBuildContext context, Expression expression, Boolean unwrap) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.SqlBuilder.cs:line 1029 at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertCompare(IBuildContext context, ExpressionType nodeType, Expression left, Expression right) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.SqlBuilder.cs:line 1588 at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertPredicate(IBuildContext context, Expression expression) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.SqlBuilder.cs:line 1370 at LinqToDB.Linq.Builder.ExpressionBuilder.BuildSearchCondition(IBuildContext context, Expression expression, List`1 conditions) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.SqlBuilder.cs:line 2529 at LinqToDB.Linq.Builder.ExpressionBuilder.BuildWhere(IBuildContext parent, IBuildContext sequence, LambdaExpression condition, Boolean checkForSubQuery, Boolean enforceHaving) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.SqlBuilder.cs:line 48 at LinqToDB.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\WhereBuilder.cs:line 23 at LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.cs:line 175 at LinqToDB.Linq.Builder.SelectBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\SelectBuilder.cs:line 36 at LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.cs:line 175 at LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]() in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.cs:line 146 at LinqToDB.Linq.Query`1.CreateQuery(IDataContext dataContext, Expression expr) in C:\projects\linq2db\Source\LinqToDB\Linq\Query.cs:line 280 at LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression& expr) in C:\projects\linq2db\Source\LinqToDB\Linq\Query.cs:line 233 at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression& expression, Boolean cache) in C:\projects\linq2db\Source\LinqToDB\Linq\ExpressionQuery.cs:line 84 at LinqToDB.Linq.ExpressionQuery`1.get_SqlText() in C:\projects\linq2db\Source\LinqToDB\Linq\ExpressionQuery.cs:line 53 at ConsoleApp.Program.WorkWithDb(DbMain db) in C:\Src\Personal\TestPolygon\ConsoleApp\Program.cs:line 68 at ConsoleApp.Program.WorkWithDb(String dataSource, String initialCatalog) in C:\Src\Personal\TestPolygon\ConsoleApp\Program.Db.cs:line 57 at ConsoleApp.Program.Main() in C:\Src\Personal\TestPolygon\ConsoleApp\Program.Core.cs:line 21 Если делать фильтрацию попозже: var query = from author in authors let booksAgg = ( from book in books where book.AuthorId == author.Id select new { Count = Sql.Ext.Count(book.Id).ToValue() } ).Single() select new { author.Name, BooksCount = booksAgg.Count }; query = query.Where(x => x.BooksCount > 42); то падает с другим исключением: System.NotImplementedException: The method or operation is not implemented. at LinqToDB.Linq.Builder.SelectContext.ProcessMemberAccess[T](Expression expression, MemberExpression levelExpression, Int32 level, Func`6 action) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\SelectContext.cs:line 974 at LinqToDB.Linq.Builder.SelectContext.IsExpressionInternal(Expression expression, Int32 level, RequestFor requestFlag) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\SelectContext.cs:line 731 at LinqToDB.Linq.Builder.SelectContext.IsExpression(Expression expression, Int32 level, RequestFor requestFlag) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\SelectContext.cs:line 627 at LinqToDB.Linq.Builder.ExpressionContext.IsExpression(Expression expression, Int32 level, RequestFor requestFlag) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionContext.cs:line 116 at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass97_0.b__0(Expression expr) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.SqlBuilder.cs:line 90 at LinqToDB.Expressions.Extensions.Visit(Expression expr, Func`2 func) in C:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 373 at LinqToDB.Expressions.Extensions.Visit(Expression expr, Func`2 func) in C:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 418 at LinqToDB.Linq.Builder.ExpressionBuilder.CheckSubQueryForWhere(IBuildContext context, Expression expression, Boolean& makeHaving) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.SqlBuilder.cs:line 149 at LinqToDB.Linq.Builder.ExpressionBuilder.BuildWhere(IBuildContext parent, IBuildContext sequence, LambdaExpression condition, Boolean checkForSubQuery, Boolean enforceHaving) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.SqlBuilder.cs:line 32 at LinqToDB.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\WhereBuilder.cs:line 23 at LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo) in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.cs:line 175 at LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]() in C:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.cs:line 146 at LinqToDB.Linq.Query`1.CreateQuery(IDataContext dataContext, Expression expr) in C:\projects\linq2db\Source\LinqToDB\Linq\Query.cs:line 280 at LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression& expr) in C:\projects\linq2db\Source\LinqToDB\Linq\Query.cs:line 233 at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression& expression, Boolean cache) in C:\projects\linq2db\Source\LinqToDB\Linq\ExpressionQuery.cs:line 84 at LinqToDB.Linq.ExpressionQuery`1.get_SqlText() in C:\projects\linq2db\Source\LinqToDB\Linq\ExpressionQuery.cs:line 53 at ConsoleApp.Program.WorkWithDb(DbMain db) in C:\Src\Personal\TestPolygon\ConsoleApp\Program.cs:line 22 at ConsoleApp.Program.WorkWithDb(String dataSource, String initialCatalog) in C:\Src\Personal\TestPolygon\ConsoleApp\Program.Db.cs:line 56 at ConsoleApp.Program.Main() in C:\Src\Personal\TestPolygon\ConsoleApp\Program.Core.cs:line 21 Для меня больше важен вариант с from book in books where book.AuthorId == author.Id select new { Count = Sql.Ext.Count(book.Id).ToValue() } потому что на практике надо считать по подзапросу не один агрегат, а несколько.... << RSDN@Home 1.0.0 alpha 5 rev. 0>> [Less]
Posted almost 7 years ago by Basker
Доброго времени суток! Пишу тут, а не на ГитХАБе, т.к. с английским плохо. Столкнулся с непонятной ситуацией, во всем проекте все нормально, аналогичные места в коде работают нормально, а при разработке нового куска проблема вылезла. Есть ... [More] ряд классов: [Serializable] public class ItemGroup { public int Id { get; set; } public string Name { get; set; } } [Serializable] public class ItemType { public int Id { get; set; } public string Name { get; set; } public ItemGroup ItemGroup { get; set; } <--- = null при повторном вызове public ItemType() { ItemGroup = new ItemGroup(); } } [Serializable] public class Item { public int Id { get; set; } public string Name { get; set; } public ItemType ItemType { get; set; } // <--- = null при повторном вызове // … [MapIgnore] public string ItemTypeName { get { return ItemType.Name; } } [MapIgnore] public string ItemGroupName { get { return ItemType.ItemGroup.Name; } } // … public Item() { ItemType = new ItemType(); } } В ItemRepository: public class ItemRepository { private const string GetItemsQuery = @" SELECT i.Id AS [Id], i.Name AS [Name], t.Id AS [ItemType.Id], t.Name AS [ItemType.Name], g.Id AS [ItemType.ItemGroup.Id], g.Name AS [ItemType.ItemGroup.Name] FROM Items i JOIN ItemTypes t JOIN ItemGroups g ON t.GroupId = g.Id ON i.TypeId = t.Id WHERE g.Id = @groupId AND t.Id = @typeId"; public List GetItems(int groupId, int typeId) { using (var db = new DbManager()) { return db.SetCommand(GetItemsQuery, db.Parameter("@groupId", groupId), db.Parameter("@typeId", typeId)) .ExecuteList(); } } } И где-то в коде: private void ShowData(int groupId, int typeId) { var items = itemsRepository.GetItems(groupId, typeid); itemsBindingSource.DataSource = new BindingListImpl(Filter(items), typeof(Item)); } При вызове ShowData() в коде первый раз все хорошо, свойство ItemType в экземпляре класса Item и свойство ItemGroup в экземпляре класса ItemType заполнены. Если этот метод вызвать еще раз, то поля ItemType и ItemGroup равны null. При последующих вызовах поля также остаются пустыми. Т.е. повторный и последующие вызовы db.ExecuteList() возвращает не полностью заполненный объект. Запрос в базу приходит корректный и данные возвращает. Ощущение что не вызывается конструктор по умолчанию (без параметров) или отваливается маппинг. Но в куче других мест с подобными запросами к той же таблице возвращают экземпляры данных классов корректно. Это я где-то дико туплю и ошибка до того глупая, что не замечаю ее, или что то другое? [Less]