Linq2Sql:通常 select 2 个基于给定表达式的字段

Linq2Sql: Generically select 2 fields based on given expression

我正在尝试实现 Entity Framework 的动态存储库。我注意到我们使用了很多这种模式:

public Dictionary<int, string> SelectSomething(IEnumerable<int> ids)
{
    return entity
            .Table
            .Where(t => ids.Contains(t.IdField))
            .Select(t => new {t.IdField, t.ValueField})
            .ToDictionary(k => kIdField, v => v.ValueField);
}

基本上,select 和 return 具有 Id 的字典符合某些条件。

我正在尝试重写这个方法。到目前为止我得到了签名:

Dictionary<TKey, TValue> GetEntityKeyValue<TEntity, TKey, TValue>(   
        Expression<Func<TEntity, TKey>> keyExpression, 
        Expression<Func<TEntity, TValue>> valueExpression, 
        Expression<Func<TKey, bool>> keyPredicate)

        where TEntity : class
{ ... }

基本上,这样我就可以打电话了

var valueDict = GetEntityKeyValue<tbl_table, int, string>(t => t.IdField, t.ValueField, id => id > 1);

请帮我写 GetEntityKeyValue 方法。我知道它会涉及动态表达式,但我不知道怎么写。

不需要

Select 语句,而且它会创建对匿名类型的投影,从而导致相应的 Expression 构建要求:

public Dictionary<TKey, TValue> GetEntityKeyValue<TEntity, TKey, TValue>
(
    Func<TEntity, TKey> keySelector,
    Func<TEntity, TValue> valueSelector,
    Expression<Func<TEntity, bool>> keyPredicate
) where TEntity : class
{
    return context.Set<TEntity>().Where(keyPredicate)
                  .ToDictionary(keySelector, valueSelector);
}