Подскажите, исходя из чего (и для чего) принимается решение встраивать параметры linq запросов в sql-код в виде констант? Можно ли как-то на это повлиять? Обратил внимание, что это происходит со многими запросами, но не со всеми, зависимость не догоняю.
|
есть простой left join
var permissions = (
from parentSmetaItem in SmetaItems
join permission in Permissions on new {SmetaItemID = parentSmetaItem.ID, UserID = userID} equals
... [More]
new {permission.SmetaItemID, permission.UserID} into g
from permission in g.DefaultIfEmpty()
select new {parentSmetaItem.OwnerID, permission.CanRead}
).ToList();
проблема в том, что permission.CanRead имеет тип bool, а мне на выходе хотелось бы получить null, если в правой таблице нет записи. пробывал и обычным кастом (bool?)permission.CanRead и Sql.ConvertTo<bool?>.From(permission.CanRead) все равно вместо null'я false возвращается.
работает такой вариант:
var permissions = (
from parentSmetaItem in SmetaItems
join permission in Permissions on new {SmetaItemID = parentSmetaItem.ID, UserID = userID} equals
new {permission.SmetaItemID, permission.UserID} into g
from permission in g.DefaultIfEmpty()
select new {parentSmetaItem.OwnerID, CanRead = permission != null ? (bool?)permission.CanRead : null}
).ToList();
но в этом случае — на клиента зачем то тащатся все поля таблицы Permissions.
Как быть ?? BLToolkit последний из NuGet'а [Less]
|
Posted
over 12 years
ago
Не совсем понятно зачем в BLToolkit для меппинга полей через аттрибуты такие "навороты", просто ради интерфейсов и демонстрации возможностей ооп и паттернов ?
Вообще зачем нужен BLToolkit для работы с БД, абстракция от БД поддерживается на уровне
... [More]
стандартных IDbxxxxxx
Единственное удобство это меппинг, но и там оверхед из-за кучи посредников, получается не эффективно в проектах где требуется хорошая производительность, проще написать свой инициализатор достаточно универсальный для всех проектов без оверхеда.
Еще несколько вопросов:
почему BusinessLogic называется, а реализовано взаимодействие с БД ?
в чем заключается какая-то поддержка Linq ( в анонсах видел что якобы реализована поддержка ) ? из ExecuteReader() возвращается коллекция IList<> а Linq с ней и сам может работать. [Less]
|
Почему для реализации batch insert был выбран именно insert all с простыней инсертов?
Есть же куда более подходящий инструмент — Bulk Inserts Using Array Binding. Он не генерит простыню инсертов со значениями параметров в виде строк который еще
... [More]
нужно отпарсить серверу. Он безопаснее и, самое главное, гораздо быстрее и менее глючнее (не нужно ограничивать maxBatchSize — привет ошибка оракла на ограниченное количество "столбцов" в одном запросе).
При использовании хранимых процедур этот механизм задействуется.
Вот пример:
string sql = "insert into bulk_test (employee_id, first_name, last_name, dob) values (:employee_id, :first_name, :last_name, :dob)";
var employeeIds = new int[1000];
var firstNames = new string[1000];
var lastNames = new string[1000];
var dobs = new DateTime[1000];
// тут инициализируем массивы
var cmd = connection.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
// To use ArrayBinding, we need to set ArrayBindCount
cmd.ArrayBindCount = employeeIds.Length;
// Instead of single values, we pass arrays of values as parameters
cmd.Parameters.Add(":employee_id", OracleDbType.Int32,
employeeIds, ParameterDirection.Input);
cmd.Parameters.Add(":first_name", OracleDbType.Varchar2,
firstNames, ParameterDirection.Input);
cmd.Parameters.Add(":last_name", OracleDbType.Varchar2,
lastNames, ParameterDirection.Input);
cmd.Parameters.Add(":dob", OracleDbType.Date,
dobs, ParameterDirection.Input);
cmd.ExecuteNonQuery();
собственно единственное изменение в выделенном месте. [Less]
|
Ребят, просто вопрос по ускорению разработки: тута предлагают аж три утилиты, генерящие классы по схеме в БД. Какая из них наиболее актуальная/развивается?
(сам юзал самописный Perl конвертер)
Ну и чтоб 2 раза не вставать: четвёртым предлагается
... [More]
"Using Linq to SQL data model designer". Догадываюсь, это какой-то встроенный в VS инструмент, но разве он выдаст именно те атрибуты, что требует BLT?? Или нужно будет допиливать исходники?
И совсем чтоб не садиться Хочу заюзать LINQ практически для единственной вещи — динамическое построение запроса (где добавляются фильтры по колонкам). Это стандартная для LINQ вещь? BLT её поддерживает?
До этого строил запросы просто построением SQL-строки. Тупо, зато понятно и работает на любом фрэймворке.
Да, и ещё: вот эти все три конвертера — они построят не только классы-таблицы, но и главный класс Database? (ну для которого пишут db.Employee.Insert(blah....) )
Спасибо! [Less]
|
Привет!
При повторном клонировании EditableObject теряется IsDirty у вложенной сущности.
[TestFixture]
public class CloneObjectTest
{
[Test]
public void PreserveIsDirtyPerCloneObjectTest()
{
// Arrange
var
... [More]
entity = TestEntity.CreateInstance();
entity.TestChildEntity = TestChildEntity.CreateInstance();
entity.IntProp = 1;
entity.TestChildEntity.IntProp = 1;
entity.AcceptChanges();
// Act
var firstClone = entity.Clone();
firstClone.IntProp = 0;
firstClone.TestChildEntity.IntProp = 0;
var secondClone = firstClone.Clone();
// Assert
Assert.False(entity.IsDirty);
Assert.False(entity.TestChildEntity.IsDirty);
Assert.True(firstClone.IsDirty);
Assert.True(firstClone.TestChildEntity.IsDirty);
Assert.True(secondClone.IsDirty);
Assert.True(secondClone.TestChildEntity.IsDirty); // fail
}
public abstract class TestEntity : EditableObject<TestEntity>
{
public abstract int IntProp { get; set; }
public abstract TestChildEntity TestChildEntity { get; set; }
}
public abstract class TestChildEntity : EditableObject<TestChildEntity>
{
public abstract int IntProp { get; set; }
}
} [Less]
|
Если два объекта ссылаются друг на друга получаем StackOverflowException.
Пример для воспроизведения:
public class Program
{
public abstract class Departament
{
public abstract int Id { get; }
... [More]
public abstract int Chief_Id { get; set; }
[Association(ThisKey="Chief_Id", OtherKey="Id")]
public abstract Employee Chief { get; set; }
}
public abstract class Employee
{
public abstract int Id { get; }
public abstract int Departament_Id { get; set; }
[Association(ThisKey = "Departament_Id", OtherKey = "Id")]
public abstract Departament Departament { get; set; }
}
static void Main(string[] args)
{
DbManager.AddConnectionString("Server=(localdb)\\Projects; Database=Database; Integrated Security=true");
using (var db = new DbManager())
{
foreach (var item in db.GetTable<Departament>())
{
Console.WriteLine(item.Id);
}
}
}
} [Less]
|
Posted
over 12 years
ago
Что-то давненько не было новых релизов.
lin2db вообще появился ли на свет (с nemerle или без) или так и был заброшен?
IT, поделись новостями и состоянием дел, если не трудно!
|
Привет
В нашей базе есть таблицы с одинаковым именем, но в разных схемах.
Schema1.MyTable
Schema2.MyTable
При генерации модели через .tt файлы получаем 2 класа MyTable что конечно не правильно.
Как проще и правильнее решить эту
... [More]
проблему?
Никаких изменений в БД быть не может.
Спасибо... << RSDN@Home 1.2.0 alpha 5 (M4) rev. 1510>> [Less]
|
После недавних изменений в BLToolkit появился баг в генераторе SQL.
Заметил на последней версии, собранной из git-репозитория, ветка master.
Вот есть простая модель, классы размечены атрибутами Linq2sql:
using System.Data.Linq.Mapping;
... [More]
[Table]
class Sample
{
[Column(Name="ID")] public long ID { get; set; }
[Column(Name="NAME")] public string Name { get; set; }
}
[Table]
class BrokenSample
{
// column names != property names
[Column(Name="ID_")] public long ID { get; set; }
[Column(Name="NAME_")] public string Name { get; set; }
}
Запрос к первому классу генерируется нормально.
В запросе ко второму классу делается SELECT всех колонок из таблицы.
Единственное отличие между классами — во втором имена колонок не совпадают с именами свойств.
using (var db = new DbManager())
{
var query =
from s in db.GetTable<Sample>()
select s.Name;
// everything is fine
Console.WriteLine(query.ToString());
var query2 =
from s in db.GetTable<BrokenSample>()
select s.Name;
// all columns from BrokenSample are selected
Console.WriteLine(query2.ToString());
}
Вот такие SQL-запросы генерируются:
-- . Sql MsSql2005
SELECT
[s].[NAME] as [Name]
FROM
[s]
-- . Sql MsSql2005
SELECT
[s].[ID_] as [ID],
[s].[NAME_] as [Name]
FROM
[s] [Less]
|