Freesql查詢指定字段數據


返回指定字段:

//返回一個字段
List<int> t5 = fsql.Select<Topic>().ToList(a => a.Id);

//返回匿名類
List<匿名類> t6 = fsql.Select<Topic>().ToList(a => new { a.Id, a.Title });

//返回元組
List<(int, string)> t7 = fsql.Select<Topic>().ToList<(int, string)>("id, title");

//返回SQL字段
List<匿名類> t8 = fsql.Select<Topic>().ToList(a => new {
    a.Id,
    a.Title,
    a.Type, //可以直接返回導航屬性 Type
    cstitle = "substr(a.title, 0, 2)", //將 substr(a.title, 0, 2) 作為查詢字段
    csnow = Convert.ToDateTime("now()"), //將 now() 作為查詢字段
    //奇思妙想:怎么查詢開窗函數的結果
});

//返回子查詢的字段
List<匿名類> t9 = fsql.Select<Topic>().ToList(a => new {
    a.Id,
    count = fsql.Select<T2>().Count(),
    max = fsql.Select<T2>().Max(b => b.Id),
    min = fsql.Select<T2>().Min(b => b.Id),
    name = fsql.Select<2>().First(b => b.name)
});

 

關於忽略某些字段的功能,因為多表機制不好確定,所以沒提供官方接口,不過可以通過以下擴展方法來實現:

public static List<T1> ToListIgnore<T1>(this ISelect<T1> that, Expression<Func<T1, object>> selector)
{
    if (selector == null) return that.ToList();
    var s0p = that as Select0Provider;
    var tb = s0p._tables[0];
    var parmExp = tb.Parameter ?? Expression.Parameter(tb.Table.Type, tb.Alias);
    var initExps = tb.Table.Columns.Values
        .Where(a => a.Attribute.IsIgnore == false)
        .Select(a => new 
        {
            exp = Expression.Bind(tb.Table.Properties[a.CsName], Expression.MakeMemberAccess(parmExp, tb.Table.Properties[a.CsName])),
            ignored = TestMemberExpressionVisitor.IsExists(selector, Expression.MakeMemberAccess(parmExp, tb.Table.Properties[a.CsName]))
        })
        .Where(a => a.ignored == false)
        .Select(a => a.exp)
        .ToArray();
    var lambda = Expression.Lambda<Func<T1, T1>>(
        Expression.MemberInit(
            Expression.New(tb.Table.Type),
            initExps
        ),
        parmExp
    );
    return that.ToList(lambda);
}

class TestMemberExpressionVisitor : ExpressionVisitor
{
    public string MemberExpString;
    public bool Result { get; private set; }

    public static bool IsExists(Expression selector, Expression memberExp)
    {
        var visitor = new TestMemberExpressionVisitor { MemberExpString = memberExp.ToString() };
        visitor.Visit(selector);
        return visitor.Result;
    }
    protected override Expression VisitMember(MemberExpression node)
    {
        if (!Result && node.ToString() == MemberExpString) Result = true;
        return node;
    }
}

 

參考網址: https://www.cnblogs.com/FreeSql/p/11531376.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM