【发布时间】:2010-11-02 21:45:36
【问题描述】:
我有这个:
List<string> fields;
fields[0] = "firstFieldName";
fields[1] = "secondFieldName";
...
fields[n] = "nthFieldName";
我想得到这个:
var selector = p => new {p.firstField, p.secondField, ..., p.nthFieldName}
// selector is of type Expression<Func<Entity, object>>
GoofBallLogic 有类似的this code,最后是p => p.column
// Entity is an object in a diagram from Entity Framework 4
var p = Expression.Parameter(typeof(Entity, "p");
var selector = Expression.Lambda<Func<Entity, string>(
Expression.Property(p, columnToGroupBy), p );
编辑:我想要完成的事情
我有一个“通用”存储库:
public class Repository<E, C> : IRepository<E,C>
{
private C _dc {get;set;} // ObjectContext (Entity Framework 4)
private string _entityName {get;set;}
public string entityKeyName {get;private set;}
public List<string> entityKeys {get;private set;}
public Expression<Func<E, object>> entityKey {get;private set;}
private EntityContainer _containerName {get;set;}
public Repository(C myDC)
{ _dc = myDC; // TODO: check for null
// Name of "this" ObjectContext
_containerName = _dc.MetadataWorkspace.GetEntityContainer(
_dc.DefaultContainerName, DataSpace.CSpace);
// Name of "this" Entity
_entityName = _containerName.BaseEntitySets
.Where(p => p.ElementType.Name == typeof (E).Name)
.Select( p => p.Name).FirstOrDefault();
// String list of the keys
entityKeys = _containerName
.BaseEntitySets.First(meta => meta.ElementType.Name ==
typeof(E).Name)
.ElementType.KeyMembers.Select(k => k.Name).ToList();
// Thanks Jon Skeet for this cool comma sep list formula
entityKeyName = string.Join(",", entityKeys.ToArray() );
entityKey = Expression.Lambda<Func<E, object>> ...
如何将 entityKey 设置为可用于 一个 OrderBy 语句,因为 Linq to Entities 需要 在执行 .Skip().Take() 之前订购一套
编辑:
令人惊讶的是,Orderby 可以接受这个:
p => "field1,field2,field3"
这允许我的代码执行,但实际上并没有按字段值对项目进行排序。我猜这是 TDD 的第一步:使用文字。
【问题讨论】:
-
您能更具体地说明您要完成的工作吗?比如,你想在哪个上下文中使用选择器?
-
“匿名”类型实际上是实体的键。我们不必对此匿名。 :)
-
using p => "field1,field2,field3" 不会进行任何排序,因为您按字符串 "field1,field2,field3" 对每个值进行排序,因此它们都是相同的。
-
您在某些字段上使用了下划线,而在其他字段上没有。您正在赞扬 Jon Skeet 的一个非常基本的基本函数调用。我的印象是,您通过粘贴来自不同人的代码将其拼接在一起,并且没有费心做任何自己的想法......
-
下划线是私有变量。我在使用时会记下其他代码。当我花太长时间自己解决问题时,我会在 SO 上提出问题。在 Timwi 要求澄清问题之前,我没有发布该代码。
标签: c# entity-framework-4 lambda