.net 如何将Lambda值传递到通用存储库
我的应用程序中有许多存储库,我想尝试创建一个通用存储库,以减少代码重复 反复出现的一个要求是需要在下拉列表中列出我的实体 在我当前的混凝土存储库中,我有以下内容:.net 如何将Lambda值传递到通用存储库,.net,lambda,repository-pattern,.net,Lambda,Repository Pattern,我的应用程序中有许多存储库,我想尝试创建一个通用存储库,以减少代码重复 反复出现的一个要求是需要在下拉列表中列出我的实体 在我当前的混凝土存储库中,我有以下内容: public IEnumerable GetSelectList() { return _context.Cultures.Select(x => new SelectListItem { Text = x.CultureKey, Value = x.CultureID.ToStr
public IEnumerable GetSelectList()
{
return _context.Cultures.Select(x => new SelectListItem
{
Text = x.CultureKey,
Value = x.CultureID.ToString()
}).ToList();
}
因此,我想做的是使用一个通用的GetSelectList
函数,该函数允许我指定要在选择列表项中的文本
和值
字段中使用的值(在上面的代码中是CultureKey
和CultureID
)
我不确定如何在通用存储库中配置这些值。有没有办法将字符串值作为lambda值进行求值?还是有其他方法可以实现我想要的?我认为您应该将存储库与UI逻辑分离。在数据访问层上,将特定于UI的逻辑混用为
SelectListItem
“不正确”
我将在该方法上实现您需要的任何查询,并在controller上构建SelectListItem
列表
OTOH我认为不值得花费精力来封装逻辑来创建
SelectListItem
列表,一旦您将其移动到控制器,您将不会获得太多收益 抛开泛型存储库是否应该知道有关SelectListItem的任何信息的问题不谈(protip:it not),您可以通过传入两个lamda函数来实现这一点
public class GenericRepo<T>
{
public IEnumerable GetSelectList(Func<T,string> text, Func<T,string> value)
{
return _context.Cultures.Select(x => new SelectListItem
{
Text = text(x),
Value = value(x)
}).ToList();
}
}
可以说更好的方法是将其解耦,这样您的方法将返回一个IEnumerable
,并将其映射到UI层中的SelectListItem
。为IEnumerable
创建一个扩展方法,以转换为SelectListItems
列表:
public static class Extensions
{
public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> data, Func<T,string> text, Func<T,string> value)
{
return data.Select(x => new SelectListItem
{
Text = text(x),
Value = value(x)
});
}
}
SelectListItem与“视图”相关,如果您开始将视图逻辑与域逻辑混用,它将在将来给您带来麻烦。或者,添加一个视图帮助器或视图模型,将特定字段转换为键和值。完全记住这不属于存储库,因为它当然不属于存储库。接受这个答案,因为它回答了lambda问题
public static class Extensions
{
public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> data, Func<T,string> text, Func<T,string> value)
{
return data.Select(x => new SelectListItem
{
Text = text(x),
Value = value(x)
});
}
}
var results = _cultures.ToSelectList(o=>o.CultureKey, o=>o.CultureId.ToString());