我的朋友们,在任何糟糕的情况下,你总是帮助我:)谢谢你
我有2个或更多的存储库在他们自己的上下文中工作,返回连接到同一个基本查询的数据:
public IQueryable<LQ_Group> GetAdminedGroupsQ(User user)
此结果由User,Group,GroupMember和其他reposotories使用。
实现它的最佳方法是什么?我不喜欢有相同逻辑的不同副本。思考?
{
try
{
return
(from ap in context.LQ_Permissions
join g in context.LQ_Groups on
new { GroupID = ap.ObjectID, GroupTypeID = ap.ObjectTypeID }
equals
new { GroupID = g.GroupID, GroupTypeID = Dict.ObjectType[ObjectType.Group].ID }
where ((ap.SubjectID == user.ID) && (ap.SubjectTypeID == Dict.ObjectType[ObjectType.User].ID))
select g);
}
catch (Exception ex)
{
throw new UnknownRepositoryException(ex.Message);
}
}
谢谢。
答案 0 :(得分:0)
你可以这样做:
public class MyRepository
{
private List<Item> mItems;
public IEnumerable<Item> GetAllItems()
{
return this.mItems;
}
public IEnumerable<Item> GetGoodItems()
{
return this.GetAllItems().Where(x => x.IsGood == true);
}
public IEnumerable<Item> GetGoodItemsOverFiveDollars()
{
return this.GetGoodItems().Where(x => x.Price > 5.00m);
}
}
public class Item
{
public bool IsGood { get; set; }
public decimal Price { get; set; }
}
您可以这样做,因为在计算枚举之前不会执行查询。但是,请记住,可以在MyRepository类之外添加其他linq语句,因此您可以使用“linq injection”;)。
您可以通过包装方法并将它们设置为内部来避免这种情况,其中包装方法调用ToList或ToArray,从而允许查询执行。
您目前如何执行查询,以及您希望减少哪些重复?你能提供一个例子吗?