C# 从函数获取属性<&燃气轮机;

C# 从函数获取属性<&燃气轮机;,c#,.net,C#,.net,我试图返回已传递给Func的属性,以便可以将此属性与DbSet一起使用。请参见下面的代码 呼叫代码: \u示例repository.CountByField(x=>x.Status) 通用存储库中的接收方法: public Dictionary<string, int> CountByField(Expression<Func<TEntity, string>> field) { var whichFie

我试图返回已传递给Func的属性,以便可以将此属性与DbSet一起使用。请参见下面的代码

呼叫代码:
\u示例repository.CountByField(x=>x.Status)

通用存储库中的接收方法:

        public Dictionary<string, int> CountByField(Expression<Func<TEntity, string>> field)
        {
            var whichField = ((MemberExpression) field.Body).Member.Name;
            var data = _dbSet.Select(x => whichField).GroupBy(y => y);

            var returnData = new Dictionary<string, int>();
            foreach (var item in data)
            {
                returnData.Add(item.Key, item.Count());
            }

            return returnData;
        }
公共字典CountByField(表达式字段)
{
var whichField=((MemberExpression)field.Body).Member.Name;
var data=_dbSet.Select(x=>whichField.GroupBy(y=>y);
var returnData=newdictionary();
foreach(数据中的var项)
{
returnData.Add(item.Key,item.Count());
}
返回数据;
}
目前,我可以返回传递的属性的名称,但我需要使用实际属性来正确完成_dbSet.Select()行

有什么想法吗?我觉得我不在一百万英里之外!只是需要一个指向正确方向的点


干杯。

你把事情复杂化了;您的
字段
参数已经适合直接传递到
选择
:)您可能还应该聚合查询中的数据,而不是为您得到的每个组发出新的查询:

public Dictionary<string, int> CountByField(Expression<Func<TEntity, string>> field)
  =>
     _dbSet
       .Select(field)
       .GroupBy(i => i)
       .Select(i => new { Key = i.Key, Count = i.Count() })
       .ToDictionary(i => i.Key, i => i.Count);
公共字典CountByField(表达式字段)
=>
_数据库集
.选择(字段)
.GroupBy(i=>i)
.Select(i=>new{Key=i.Key,Count=i.Count()})
.ToDictionary(i=>i.Key,i=>i.Count);

什么是tenty?只需将
字段直接传递到
选择中即可。它已经做了您希望它做的事情。另外,您可能想做
.Select(group=>new{Key=group.Key,Count=group.Count()})。ToDictionary(i=>i.Key,i=>i.Count)而不是在客户端循环数据并分别获取每个组的计数。@Luaan我尝试首先传递“field”,但我得到了这个错误:“LINQ to实体中不支持LINQ表达式节点类型“Lambda”。@nebula099不是
x=>field
,只是
\u dbSet.Select(field)
<代码>字段
已经是lambda表达式。@Fabio
ToDictionary
在执行查询后使用可枚举项。
Count()。