我正在使用LLBLGEN,其中有一个方法来执行查询scalar query
.谷歌搜索给了我一个定义scalar sub-query
,它们是一样的吗?
我有一些代码能够检索包含特定关系的所有实体,如下所示:
var bucket = new RelationPredicateBucket();
bucket.Relations.Add(MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId);
var messageEntities = new EntityCollection<MessageEntity>();
using (var myAdapter = PersistenceLayer.GetDataAccessAdapter())
{
myAdapter.FetchEntityCollection(messageEntities, bucket);
}
Run Code Online (Sandbox Code Playgroud)
效果很好.现在,我想让Message表中的所有实体在MessageTemplate xref表中没有对应的行.也就是说,MessageEntity.Relations.MessageTemplateReferenceEntityUsingMessageId为null/false /不存在.
这是一个惊人的黑客攻击,我的一个队友几年前做过这项工作(上面代码的实体集合在下面的templatedMessages中):
bucket.PredicateExpression.Add(MessageFields.Id
!= templatedMessages.Select(m =>
m.Id).ToArray());
Run Code Online (Sandbox Code Playgroud)
这实际上是有效的,直到最近表中templatedMessages的数量增长到2100以上,并且该方法开始抛出这些异常:
传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确.此RPC请求中提供的参数太多.最高为2100.
显然,传递SQL应该避免的完整ID列表并不是非常有效.LLBLGen中最好的方法是什么?在SQL中我会做类似的事情:
SELECT m.* FROM Message m
WHERE NOT EXISTS (SELECT 1 FROM MessageTemplate mt WHERE mt.MessageID = m.ID)
Run Code Online (Sandbox Code Playgroud)
我可以在LLBLGen中这样做吗?
我一直在使用ORM工具/代码生成器,我看到,他们更喜欢使用decimal
来int
映射列属性时的值.使用小数有什么好处吗?
数据库中的列类型是我认为Number
创建的默认值Number(38, 0)
.
所以我需要在运行时动态访问类属性的值,但我无法弄清楚如何做到这一点...任何建议?谢谢!
//Works
int Order = OrdersEntity.ord_num;
//I would love for this to work.. it obviously does not.
string field_name = "ord_num";
int Order = OrdersEntity.(field_name);
Run Code Online (Sandbox Code Playgroud)
好的,所以这里是我到目前为止的反射,除非它循环的集合项是一个字符串:
void RefreshGrid(EntityCollection<UOffOrdersStgEcommerceEntity> collection)
{
List<string> col_list = new List<string>();
foreach (UOffOrdersStgEcommerceEntity rec in collection)
{
foreach (System.Collections.Generic.KeyValuePair<string, Dictionary<string, string>> field in UOffOrdersStgEcommerceEntity.FieldsCustomProperties)
{
if (!string.IsNullOrEmpty((string)rec.GetType().GetProperty(field.Key).GetValue(rec, null)))
{
if (!col_list.Contains<string>((string)rec.GetType().GetProperty(field.Key).GetValue(rec, null)))
col_list.Add((string)rec.GetType().GetProperty(field.Key).GetValue(rec,null));
}
}
foreach (string ColName in col_list)
{
grdOrders.Columns.Add(new DataGridTextColumn
{
Header = ColName,
Binding = new Binding(ColName)
});
}
}
grdOrders.ItemsSource = …
Run Code Online (Sandbox Code Playgroud) 长话短说:
是否有某种方法可以将抽象方法添加到基类中,从而允许派生类覆盖该方法的返回类型,而无需使用泛型,并且无需使用关键字
new
?
我正在为 LLBLGen Pro 开发一些自定义模板。在此过程中,我拒绝更改 LLBLGen Pro 提供的默认模板,这样如果其他人选择实施我的模板,我的方法就不会覆盖他们的文件。
我开始处理(并取得了良好进展)的一项任务是开发一个为每个实体生成 DTO 的模板。沿着这些思路,一个目标是为我的实体提供一种ToDTO()
方法。为了进行泛型编程,我决定在公共基类中定义此方法,这就是我的麻烦开始的地方。
请记住,ToDTO()
在基类中定义方法的目的是因为我希望创建一个通用存储库(Fetch()
例如,使用方法),我希望在该存储库中工作CommonEntityBase
,而不是特定实体。
LLBLGen 定义其CommonEntityBase
类如下:
public abstract partial class CommonEntityBase : EntityBase2 {
// LLBLGen-generated code
}
Run Code Online (Sandbox Code Playgroud)
我最初的计划是将我的方法添加到另一个部分类中,如下所示:
public abstract partial class CommonEntityBase {
public abstract CommonDTOBase ToDto();
}
Run Code Online (Sandbox Code Playgroud)
我认为继承的类能够将其方法中的返回类型定义为从基类的返回类型派生的类型,如下所示:
public partial class PersonEntity : CommonEntityBase {
public override PersonDTO ToDto(){ return new PersonDTO(); }
}
Run Code Online (Sandbox Code Playgroud)
但是我错了。
我的第二次尝试是使用泛型定义类,如下所示:
public abstract partial class CommonEntityBase<T> : CommonEntityBase
where …
Run Code Online (Sandbox Code Playgroud) llblgen ×5
c# ×3
database ×1
dynamic ×1
inheritance ×1
llblgenpro ×1
nhibernate ×1
oracle11g ×1
orm ×1
reflection ×1
sql ×1