【问题标题】:How I can write something similar to Linq .Any() when writing sql server queries在编写 sql server 查询时如何编写类似于 Linq .Any() 的内容
【发布时间】:2014-09-08 13:28:58
【问题描述】:

我的 asp.net mvc web 应用程序中有以下 linq 查询:-

Public IQuerable<Technologies> Search (int? isManaged , bool PrimaryCustomerOnly, int?customerID  )
{

var technology2 = ITSys.Technologies

.Where(a => (

( !isManaged.HasValue||a.IsManaged == isManaged)

&& 
(!PrimaryCustomerOnly && a.ITSysFirewall.FirewallCustomers.Any(a2 => customerID.HasValue && a2.CustomerName.ToLower() == stringcustomerid && relatedresourcesID2.Contains(a.IT360ID.Value)))

));
//code goes here.
}

目前我想在 sql server 2008 存储过程中执行相同的查询。但我无法编写类似于 .Any() 的内容。那么任何人都可以建议我如何编写与.Any()等效的sql吗? 谢谢

【问题讨论】:

  • 一个 EXISTS 子句可能是你可以做的最接近的事情。即使它们通常也有其他方法来做到这一点(例如加入/左加入子句)
  • 顺便说一句,在不知道 1. 你的表结构 2. relatedresourcesID2(和其他变量)中的内容的情况下,重写这个查询相当困难。
  • relatedresourcesID2 是一个 IDS 数组,而 stringcustomerid 是 customerid 的字符串表示
  • 其他疑问:在relatedresourcesID2.Contains(a.IT360ID.Value) 中你确定你有一个.IT360ID,而不是a2 吗?

标签: sql sql-server linq entity-framework stored-procedures


【解决方案1】:

那里有很多猜测(关系的键,哪个表有真正的 IT360ID 字段,但我会想象这样的事情。

select t.*
from Technologies t
where IsManaged = @IsManaged 
and @PrimaryCustomerOnly = 0 
and t.IT360ID in (<some elements corresponding to relatedresourcesID2>)-- like ('1', '2', 'adsb')
and exists (select null
        from FirewallCustomers fc
        where t.Id = fc.PrimaryCustomerOnly_Id 
        and fc.customerId is not null 
        and lower(fc.CustomerName) = @stringcustomerid)

【讨论】:

    【解决方案2】:

    EXISTS 将是您可以到达的最接近.Any()

    例子

    SELECT * FROM [TABLE]
    WHERE EXISTS (SELECT 1 FROM [TABLE] WHERE NAME IS NOT NULL)
    

    相当于

    db.Table.Any(o => o.Name != null);
    

    这个特定的查询会像这样开始,我不知道如何完成它,但它应该会告诉你应该往哪个方向走。

    SELECT * FROM Technologies 
    WHERE EXISTS (SELECT 1 FROM Technologies WHERE (isManaged IS NOT NULL AND isManaged = @MANAGED) AND (PrimaryCustomerOnly == FALSE AND 
    // DO THE JOINS a.ITSysFirewall.FirewallCustomers.Any(a2 => customerID.HasValue && a2.CustomerName.ToLower() == stringcustomerid && relatedresourcesID2.Contains(a.IT360ID.Value)))
    ) 
    

    【讨论】:

    • 但是当我尝试在我的存储过程中编写诸如“其中 t.Tag = Tag and r.RESOURCENAME = Name and EXISTS....”之类的东西时,sql server management studio 会引发错误“在条件...的上下文中指定的非布尔类型的表达式”,所以不确定如何在其他条件旁边编写 EXSTST?
    • @RaphaëlAlthaus 至少可以说具有讽刺意味 :) 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多