属性选择器和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的替代方法(以防止Object
与Guid
比较……)
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);