【问题标题】:Cannot convert lambda expression to type 'bool' because it is not a delegate type无法将 lambda 表达式转换为类型“bool”,因为它不是委托类型
【发布时间】:2015-10-05 03:18:12
【问题描述】:

以下返回Cannot convert lambda expression to type 'bool' because it is not a delegate type

var Products = from s in db.Products where 
          ( from c in s.Manufacturers
  where (x => (from man in model.man where man.HasValue select man.Value).Contains(c.ManufacturerID)
  select c).Any()
  select s;

虽然这行得通

if (model.man != null)
   {
        var students = from s in db.Products
                       where (from c in s.Manufacturers
                       where model.man.Contains(c.ManufacturerID)
                       select c).Any()
                       select s;
   }

在第一种情况下我做错了什么? model.man 被声明为

public int?[] man { get; set; }

【问题讨论】:

  • 为什么在第一个查询中有x =>?删除它,因为那是查询语法而不是方法语法。

标签: c# linq lambda


【解决方案1】:

您可以改用 null 条件访问(在 C# 6 中)

var students = from s in db.Products
               where (from c in s.Manufacturers
               where model.man?.Contains(c.ManufacturerID) ?? false
               select c).Any()
               select s;

编辑:添加?? false,因为boolbool? 之间没有隐式转换

【讨论】:

    【解决方案2】:

    就像 Rahul 所说,您不能混合使用查询和方法语法。这应该编译:

     var Products = from s in db.Products
                           where(from c in s.Manufacturers
                                 where (from man in model.man
                                        where man.HasValue
                                        select man.Value)
                                        .Contains(c.ManufacturerID)
                                 select c).Any()
                           select s;
    

    如果您想在该特定点使用 lambda 表达式,您总是可以用句点链接它,例如:

    var Products = from s in db.Products
                               where(s.Manufacturers
                               .Where(c => (from man in model.man
                                   where man.HasValue
                                   select man.Value)
                                   .Contains(c.ManufacturerID))).Any()
                               select s;
    

    虽然出于个人喜好(可读性),我宁愿不混合这两种语法。如果您不熟悉方法语法,ReSharper 确实提供了将查询转换为方法链的选项(锤子图标)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多