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;
}