属性选择器和Where 使用Linq查询

我想这样做:

public class SomeEntityClass { public Guid MyClassProperty {get;set;} } public class AnotherEntityClass { public Guid AnotherProperty {get;set;} } public T GetByProperty(Guid value, Expression<Func> selector) { return = Session.Query().Where(x => selector == value).FirstOrDefault(); } 

应该叫:

 Repository.GetByProperty(Guid.NewGuid(), x => x.MyClassProperty ); Repository.GetByProperty(Guid.NewGuid(), x => x.AnotherProperty); 

但它不起作用。

有帮助吗?

谢谢。

尝试使用类似的东西:

 public T GetByProperty(TValue value, Expression> selector) { var predicate = Expression.Lambda>( Expression.Equal(selector.Body, Expression.Constant(value)), selector.Parameters ); return Session.Query().Where(predicate).FirstOrDefault(); } 

你需要在对象上调用选择器,所以这样的东西应该工作

 public T GetById(Guid id, Func idSelector) { return Session.Query().Where(x => idSelector(x) == id).FirstOrDefault(); } 

在类似的情况下,我通常使用Single(OrDefault)而不是Where / First(OrDefault)组合,因为我喜欢在某处有重复键时抛出exception。

与SWeko的答案类似,允许您键入idSelector的替代方法(以防止ObjectGuid比较……)

 public T GetById(TKey id, Func idSelector) { return Session.Query().FirstOrDefault(x => idSelector(x) == id); } 

你用这样的东西称之为……

 var result = GetById(guidId, (AnotherEntityClass x) => x.MyClassId); 

更重要的是,如果你添加了以下课程……

 public class YetAnotherEntityClass { public long MyId {get;set} } 

你仍然可以使用相同的方法……

 var result = GetById(12345, (YetAnotherEntityClass x) x=> x.MyId; 

如果您发现这是完整的表加载,请考虑以下事项:

 public T GetFirstByCriterion(Expression> criterion) { return Session.Query().FirstOrDefault(criterion); } 

可以调用

 var result = GetFirstByCriterion((AnotherEntityClass x) x => x.AnotherProprty = guidId);