C# Linq2Sql:根据给定的表达式一般选择2个字段

C# Linq2Sql:根据给定的表达式一般选择2个字段,c#,generics,linq-to-entities,C#,Generics,Linq To Entities,我正在尝试实现实体框架的动态存储库。我注意到我们使用了很多这种模式: public Dictionary<int, string> SelectSomething(IEnumerable<int> ids) { return entity .Table .Where(t => ids.Contains(t.IdField)) .Select(t => new {t.IdField,

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

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);
}
public Dictionary SelectSomething(IEnumerable id)
{
返回实体
桌子
.Where(t=>ids.Contains(t.IdField))
.Select(t=>new{t.IdField,t.ValueField})
.ToDictionary(k=>kIdField,v=>v.ValueField);
}
基本上,选择并返回一个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
{ ... }
Dictionary GetEntityKeyValue(
表达式键表达式,
表达式值表达式,
表达式(谓词)
地点:班级
{ ... }
基本上,这样我就可以打电话了

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

请帮助我编写GetEntityKeyValue方法。我知道它可能会涉及动态表达式,但我不知道如何编写它。

Select
语句不需要,而且它会创建到匿名类型的投影,从而导致相应的
表达式
构建要求:

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);
}
公共字典GetEntityKeyValue
(
Func键选择器,
Func值选择器,
表达式键谓词
)地点:班级
{
返回context.Set().Where(键谓词)
.ToDictionary(键选择器、值选择器);
}

我试过了,VS正在抱怨ToDictionary()。我想这是因为我需要先做一个.Select(I=>{key,value})。我该怎么做?我使用的是EF 6.2 BTWW,这是投诉吗?Nvm我弄明白了,我需要编译它:Context.Set().Where(keyCondition).ToDictionary(keySelector.compile(),valueSelector.compile())。我将您的答案标记为已接受。@NamNgo,要消除
Compile()
,您可以将键和值选择器的方法签名从
Expression
更改为simple
Func
。如果我想用数组.Contains()方法替换keyPredicate,该怎么办?如何将GetEntityKeyValue转换为数组而不是keyPredicate?