.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());