You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于System.Linq.Dynamic.Core实现动态Join关联与投影查询

动态Join与投影实现需求

核心需求

  • 借助System.Linq.Dynamic.Core对IQueryable实体执行动态Join关联操作
  • 基于表间关系在主表与关联表之间创建动态关联,最终将查询结果投影为特定结构的动态类型
  • 仅从主表中选择与ViewModel匹配的指定列,所有操作需在运行时动态实现

现有示例代码

private IQueryable FilterPropertiesBasedOnViewModel(IQueryable data, Type modelType, Type viewModelType, Dictionary<string, (Type, Type)> modelTypeMapping)
{
    var viewModelProperties = viewModelType.GetProperties().Select(p => p.Name).ToList();
    var modelProperties = modelType.GetProperties().Where(p => viewModelProperties.Contains(p.Name)).ToList();

    if (modelProperties.Any())
    {
        var selectExpression = new List<string>();

        foreach (var propertyInfo in modelProperties)
        {
            if (Nullable.GetUnderlyingType(propertyInfo.PropertyType) == typeof(Guid))
            {
                var (relatedType, relatedKeyType) = modelTypeMapping[propertyInfo.Name];
                var relatedTableName = relatedType.Name;

                var outerKeySelector = $"it.{propertyInfo.Name}?";
                var innerKeySelector = $"Oid";
                var resultSelector = $"new(outer.{propertyInfo.Name} as {propertyInfo.Name})";

                // Apply Join using System.Linq.Dynamic.Core
                data = data.Join(
                    GetTypedDbSet(relatedType),
                    outerKeySelector,
                    innerKeySelector,
                    resultSelector
                );
            }

            // Add the property to the select expression
            selectExpression.Add($"{propertyInfo.Name} as {propertyInfo.Name}");
        }

        var finalSelectExpression = string.Join(", ", selectExpression);

        // Project the data to include only common properties
        return data.Select($"new ({finalSelectExpression})");
    }
    else
    {
        return data;
    }
}

期望生成的SQL语句

select 
    b.Name,
    a.Name as Account,
    c.Name as Country,
    p.Name as Province,
    sp.Name as SubProvince
from 
    dbo.Branch b
left join 
    dbo.Account a on a.Oid = b.Account
left join 
    dbo.Country c on c.Oid = b.Country 
left join 
    dbo.Province p on p.Oid = b.Province
left join 
    dbo.SubProvince sp on sp.Oid = b.SubProvince

内容的提问来源于stack exchange,提问作者Jabagh Anjouk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:52:37