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]
|