【问题标题】:SQL to LINQ conversion C#SQL 到 LINQ 转换 C#
【发布时间】:2018-11-13 00:17:25
【问题描述】:

我正在尝试将此 sql 语句转换为 linq,需要一些帮助:

SELECT * 
FROM userlocation ul 
       INNER JOIN wins_user w 
               ON ul.locationname = w.location 
WHERE ul.locationname = 'Value' 
        OR ( NOT EXISTS(SELECT * 
                        FROM mulitcustomeraccess 
                        WHERE userid = 'Value') )

这是我的 Linq 代码(usr 是 WINS_USER 表):

billcodelist = String.Join(
    ",", 
    dc.USERLOCATIONs
        .Where(f => f.LOCATIONNAME == usr.LOCATION || 
               dc.MULITCUSTOMERACCESSes
                   .Where(d => d.USERID == usr.Name)
                   .Select(d => d.LOCATIONNAME)
                   .Contains(f.LOCATIONNAME))
        .Select(f => f.BILLCODECUSTNUMLIST)
        .ToArray());

我尝试将我的 linq 代码更新为此

billcodelist = String.Join(
    ",", 
    dc.USERLOCATIONs
        .Where(f => f.LOCATIONNAME == usr.LOCATION || 
               !dc.MULITCUSTOMERACCESSes
                   .Any(d => d.USERID == usr.Name)
                   .Select(d => d.LOCATIONNAME)
                   .Contains(f.LOCATIONNAME))
        .Select(f => f.BILLCODECUSTNUMLIST)
        .ToArray());

然后我收到以下错误:

'bool' 不包含 'Select' 的定义并且不可访问 扩展方法“选择”接受“布尔”类型的第一个参数 可以找到(您是否缺少 using 指令或程序集 参考?)错误。

我的问题是如何将该 SQL 转换为 linq,我做错了什么?

【问题讨论】:

  • 仅供参考,您不需要ToArray,因为String.Join 的过载需要IEnumerable<T>
  • .Any 返回一个布尔值(true,如果有任何项目满足条件),但是您尝试在结果上调用.Select,这就是您收到该错误的原因。如果.Any 应该是.Where 子句的一部分,那么您需要在.Any 后面加上另一个右括号。您也没有显示声明 usr 的位置。你不想像在 SQL 中那样加入你的 linq 吗?

标签: c# sql linq


【解决方案1】:

这是另一种选择

 var result = from ul in UserLocation
           join winUser in Wins_User on ul.locationName equals winUser.Location
           where ul.locationName == 'value' 
              || !MultiCustomerAccess.Any(x=> x.userId == "value")
           select new { // your projections.}

【讨论】:

    【解决方案2】:
    var results = USERLOCATION.Join(db.WINS_USER, w => w.LOCATION, ul => ul.locationname, (w, ul) => new {w, ul})
            .Where(_ => _.ul.LOCATIONNAME == 'Value' || !db.MULITCUSTOMERACCESS.Any(m => m.USERID == 'Value'))
            .Select(_ => _.ul.BILLCODECUSTNUMLIST);
    
    var billCodeList = string.Join(",", results);
    

    Where 子句总是需要布尔表达式,您将 where 传递给 where 但 where 不返回布尔值,而是返回 IQueryable。在上面我使用Any 来评估MULITCUSTOMERACCESS 是否有你使用过Where 的记录。

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多