Lambda表达式基于键在链中向后退

时间:2013-04-26 15:43:08

标签: c# asp.net linq lambda

KEY            NAME            REPLACED_BY
1              Foo 1.0         3
2              Bar 1.0         NULL
3              Foo 2.0         NULL

这应该代表一个带有PRODUCT表的数据库表。产品实体有3个属性KEYNAMEREPLACED_BY

我想知道的是,如果我从上下文中获取产品:

var product = context.PRODUCT.FirstOrDefault(p => p.KEY == 3);

有没有办法使用Lambda表达式来获取所有以前版本的产品(使用REPLACED_BY字段)?或者我需要制作一个foreach循环?

2 个答案:

答案 0 :(得分:1)

如果您的数据库中存在正确的关系,那么您可以像以下一样访问上一个:

var lastProduct = product.Replaced;//or what ever you call your relationship

考虑到这一点,你可以创建一个这样的函数:

List<Product> GetPreviousProducts(Product current)
{
    List<Product> results = new List<Product>();

    Product previous = current.Replaced;

    while(previous != null)
    {
        results.Add(previous);
        previous = previous.Replaced;
    }

    return results;
}

答案 1 :(得分:0)

如果我明白你想做什么,你可以试着像这样自己加入桌子:(我在这里没有任何东西可以调试,所以也许可以用一点点盐)

var products = (from p in context.PRODUCT
                join r in context.PRODUCT on p.KEY == r.REPLACED_BY
                select r)
               .Union
               (from x in context.PRODUCT where x.KEY == 3 select x);

问题是除非您有另一个公共标识符(如名称),否则您无法仅获取密钥标识的产品,并且可能会将版本号保留在单独的列中。