c# – Lambda Expression LINQ等效于SQL存在相同表/变量的查询
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Lambda Expression LINQ等效于SQL存在相同表/变量的查询,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3576字,纯文字阅读大概需要6分钟。
内容图文
我试图使用lambda表达式格式在LINQ中复制以下SQL查询(以使其与目前为止开发的代码保持一致):
SELECT *
FROM Product p
WHERE p.DateObsolete IS NULL
OR p.DateObsolete > GETDATE()
OR EXISTS (
SELECT NULL
FROM dbo.Product p1
WHERE p1.Ref01 = p.Ref01
AND p1.Ref02 = p.Ref02
AND p1.Ref03 = p.Ref03
AND p1.Version = p.Version + 1
AND p1.DateApproved IS NULL
)
看了其他问题(Linq subquery same table using lambda是我能找到的最接近但但没有说明如何“或”条件)在SO和其他地方我认为以下内容会起作用但它只会导致堆栈溢出(严重)异常和消息关于没有加载的pdb文件,我认为这是一个红色的鲱鱼.
products = products
.Where(p => !p.DateObsolete.HasValue
|| p.DateObsolete > DateTime.Now
|| products.Any(p1 => p1.Ref01 == p.Ref01
&& p1.Ref02 == p.Ref02
&& p1.Ref03 == p.Ref03
&& p1.Version == p.Version + 1
&& p1.DateApproved == null));
products是一个IQueryable变量.
产品在此上下文中定义为DbSet:
public class Product
{
public int ProductID { get; set; }
[MaxLength(200)]
public string Name { get; set; }
[MaxLength(3)]
public string Ref01 { get; set; }
[MaxLength(3)]
public string Ref02 { get; set; }
public int Ref03 { get; set; }
public int Version { get; set; }
public DateTime? DateReceivedByGraphics { get; set; }
public DateTime? DateApproved { get; set; }
public DateTime? DateObsolete { get; set; }
public bool Deleted { get; set; }
public bool Discontinued { get; set; }
}
你可能会收集我对LINQ的新手(并在SO上发布问题),所以任何帮助都会感激不尽.
解决方法:
您可以通过加入完成此操作.
DateTime date = DateTime.Today; // or .Now
var products = context.Products.Join(context.Products,
p1 => new { p1.Ref01, p1.Ref02, p1.Ref03 },
p2 => new { p2.Ref01, p2.Ref02, p2.Ref03 },
(p1, p2) => new { Product = p1, p1.Version, JoinedVersion = p2.Version, JoinedDateApproved = p2.DateApproved } )
.Where(x=> x.Product.DateObsolete > date && x.JoinedVersion == x.Version+1 && !x.JoinedDateApproved.HasValue)
.Select(x=>x.Product)
.ToList();
这将参考1-3中的产品加入自身,但随后选择“左”侧项目及其版本,“右侧”版本和批准日期. Where条件隔离了“right”版本比左侧大1并且没有批准日期的情况.结果将是具有符合这些标准的对应物的“左”产品.
更新:
如果您已将产品过滤到一组已知的适用产品,那么这将对对象起作用.例如:
// given products is an IQueryable representing the filtered products...
DateTime date = DateTime.Today; // or .Now
var productList = products.ToList(); // Materialize the EF Queryable into list of entities.
productList = productList.Join(productList,
p1 => new { p1.Ref01, p1.Ref02, p1.Ref03 },
p2 => new { p2.Ref01, p2.Ref02, p2.Ref03 },
(p1, p2) => new { Product = p1, p1.Version, JoinedVersion = p2.Version, JoinedDateApproved = p2.DateApproved } )
.Where(x=> x.Product.DateObsolete > date && x.JoinedVersion == x.Version+1 && !x.JoinedDateApproved.HasValue)
.Select(x=>x.Product)
.ToList();
如果你的目标是尝试将其作为一个可用于EF的IQueryable,那么我怀疑如果可能的话,它可能不值得复杂/时间.最糟糕的情况是,如果您确实要保留IQueryable,请使用上面的选项将产品ID选择到列表中,然后将该列表应用为针对IQueryable的过滤器.
var productList = products.ToList(); // Materialize the EF Queryable into list of entities.
// Fetch a list of applicable product IDs.
var productIds = productList.Join(productList,
p1 => new { p1.Ref01, p1.Ref02, p1.Ref03 },
p2 => new { p2.Ref01, p2.Ref02, p2.Ref03 },
(p1, p2) => new { ProductId = p1.ProductId, DateObsolete = p1.DateObsolete, p1.Version, JoinedVersion = p2.Version, JoinedDateApproved = p2.DateApproved } )
.Where(x=> x.DateObsolete > date && x.JoinedVersion == x.Version+1 && !x.JoinedDateApproved.HasValue)
.Select(x=>x.ProductId)
.ToList();
// Filter the original IQueryable.
products = products.Where(x => productIds.Contains(x.ProductId));
内容总结
以上是互联网集市为您收集整理的c# – Lambda Expression LINQ等效于SQL存在相同表/变量的查询全部内容,希望文章能够帮你解决c# – Lambda Expression LINQ等效于SQL存在相同表/变量的查询所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。