Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda表达式在基于键的链中向后退_C#_Asp.net_Linq_Lambda - Fatal编程技术网

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

C# Lambda表达式在基于键的链中向后退,c#,asp.net,linq,lambda,C#,Asp.net,Linq,Lambda,这应该用PRODUCT表来表示数据库表。产品实体有3个属性,键、名称和替换为 我想知道的是,如果我从上下文中获取产品: KEY NAME REPLACED_BY 1 Foo 1.0 3 2 Bar 1.0 NULL 3 Foo 2.0 NULL 是否有任何方法可以使用Lambda表达式获取产品的所有早期版本(使用替换为字段)?

这应该用
PRODUCT
表来表示数据库表。产品实体有3个属性,
名称
替换为

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

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

是否有任何方法可以使用Lambda表达式获取产品的所有早期版本(使用
替换为
字段)?或者我需要做一个foreach循环吗?

如果我理解你想要做什么,你可以尝试这样加入表本身:(我这里没有任何需要调试的东西,所以可能需要加一点盐)


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

如果您的数据库中有正确的关系,则可以像这样访问上一个:

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);
考虑到这一点,您可以创建如下函数:

var lastProduct = product.Replaced;//or what ever you call your relationship
列出GetPreviousProducts(当前产品)
{
列表结果=新列表();
以前的产品=当前。已更换;
while(上一个!=null)
{
结果。添加(先前);
先前=先前。已替换;
}
返回结果;
}

没有
替换
字段,如果不在集合上循环,就无法判断。@jbabey这就是
替换为
字段所做的。是的,但是产品与它替换的其他产品之间没有链接,这就是我想象的
替换
字段。谢谢,我的数据库表中只有密钥,但我想我可以通过向产品实体poco类添加属性来解决它?@Johan:不确定你的意思,我总是处理数据库中的关系,让设计者创建代码。如果你的意思是手动添加关系,而不触及数据库,那么是的,这应该很好
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;
}