存在一个名为LiteDB的漂亮数据库。我觉得不方便的是缺少用于指定实体之间关系类型(值/引用)的属性,尽管LiteDB提供了用于硬编码的流畅接口(详情:https://github.com/mbdavid/LiteDB/wiki/DbRef)。我是懒人,不想总是更新这个硬编码关系来跟踪我的数据模型中的变化。所以我决定用DbRef(我的自定义属性)归属的属性来实现数据模型实体的运行时发现。不幸的是,我因创建
而陷入困境type
TForm1 = class(TForm)
StringGrid: TStringGrid;
procedure StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
private
arrState: array[1..4, 1..4] of Integer;
end;
procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
iRow, iCol: Integer;
arrk: array[1..4, 1..4] of Integer;
begin
for iCol := 4 downto 1 do
begin
for iRow := 4 downto 1 do
begin
if (gdSelected in State) then
begin
case arrState[ARow, aCol] of
0: begin
StringGrid.Canvas.Brush.Color := clWhite;
Rect := StringGrid.CellRect(iCol, iRow);
StringGrid.Canvas.FillRect(Rect);
Inc(arrState[iRow, iCol]);
end;
1: begin
StringGrid.Canvas.Brush.Color := clRed;
Rect := StringGrid.CellRect(iCol, iRow);
StringGrid.Canvas.FillRect(Rect);
Inc(arrState[iRow, iCol]);
end;
2: begin
StringGrid.Canvas.Brush.Color := $008CFF;
Rect := StringGrid.CellRect(iCol, iRow);
StringGrid.Canvas.FillRect(Rect);
Inc(arrState[iRow, iCol]);
end;
3: begin
StringGrid.Canvas.Brush.Color := clGreen;
Rect := StringGrid.CellRect(iCol, iRow);
StringGrid.Canvas.FillRect(Rect);
arrState[iRow, iCol] := 0;
end;
end;
end;
end;
end;
end;
<。>在.Net运行时...用于在以下调用中提供它(第一个参数):
Expression<Func<T,K>>
类型T和K在运行时作为System.Type的实例给出(例如:T - Order,K - Customer)。
如果你们给我一些关于如何实例化
的提示,我将非常感激BsonMapper.Global.Entity<Order>().DbRef(x => x.Customer, "customers");
<。>在.Net运行时中,以便将其提供给... DbRef(...)函数。
答案 0 :(得分:1)
嗯,您有实体类型T
,属性类型K
和属性名称。要构建Expression<Func<T, K>>
,您只需使用Expression.Parameter
,Expression.Property
和Expression.Lambda
这样的方法:
var parameter = Expression.Parameter(typeof(T), "x");
var body = Expression.Property(parameter, propertyName);
var selector = Expression.Lambda(body, parameter);
答案 1 :(得分:-1)
从你的问题。让我给你发一个截图,也许它可以给你一个线索Expression> Example
public IEnumerable<TEntity> Fetch(Expression<Func<TEntity, bool>> predicate, Func<IQueryable<TEntity>,
IOrderedQueryable<TEntity>> orderBy =null, int? page = null, int? pageSize = null)
{
IQueryable<TEntity> query = _dbSet;
if (orderBy != null)
{
query = orderBy(query);
}
if (predicate != null)
{
query = query.AsExpandable().Where(predicate);
}
if (page != null && pageSize != null)
{
query = query.Skip((page.Value - 1) * pageSize.Value).Take(pageSize.Value);
}
return query;
}
我希望这会有所帮助