如何在 LINQ 选择语句中使用 Lambda

Posted

技术标签:

【中文标题】如何在 LINQ 选择语句中使用 Lambda【英文标题】:How to use Lambda in LINQ select statement 【发布时间】:2013-03-22 18:56:41 【问题描述】:

我正在尝试使用 lambda 函数选择商店并将结果转换为 SelectListItem 以便我可以呈现它。但是它会抛出“Select Clause 中的表达式类型不正确”错误:

IEnumerable<SelectListItem> stores =
    from store in database.Stores
    where store.CompanyID == curCompany.ID
    select (s => new SelectListItem  Value = s.ID, Text = s.Name );
ViewBag.storeSelector = stores;

我做错了什么?

编辑:

另外,在这种情况下如何将 Int 转换为 String?以下方法不起作用:

select (s => new SelectListItem  Value = s.ID.ToString(), Text = s.Name );
select (s => new SelectListItem  Value = s.ID + "", Text = s.Name );

编辑 2:

找出 Int 到 String 的转换。忘记包含 int2string 转换函数是 Microsoft 的典型做法。这是每个人都在使用的实际解决方法,语法完全有效:

select new SelectListItem  Value = SqlFunctions.StringConvert((double)store.ID), Text = store.Name ;

将这种情况称为荒谬是轻描淡写的。

【问题讨论】:

【参考方案1】:

使用 LINQ 查询表达式

 IEnumerable<SelectListItem> stores =
        from store in database.Stores
        where store.CompanyID == curCompany.ID
        select new SelectListItem  Value = store.Name, Text = store.ID ;

 ViewBag.storeSelector = stores;

或使用带有 lambda 表达式的 LINQ 扩展方法

 IEnumerable<SelectListItem> stores = database.Stores
        .Where(store => store.CompanyID == curCompany.ID)
        .Select(store => new SelectListItem  Value = store.Name, Text = store.ID );

 ViewBag.storeSelector = stores;

【讨论】:

你能帮我把int转换成字符串吗? LINQ to Entity 似乎没有办法将 int 转换为字符串。 @YongkeBillYu 你的意思是比如5.ToString()? 你能再创建一个问题并显示你正在做什么的代码吗? @RussCam,如果我没记错的话。 Where(store =&gt; store.CompanyID == curCompany.ID) 是 Func lamda 表达式类型??? @Kgn-web 使用Action&lt;T&gt; 当你想传递一个不返回值的委托和Predicate&lt;T&gt; 委托你需要返回一个布尔值; Predicate&lt;T&gt;是在.NET 2.0中引入的,一般Func&lt;T, bool&gt;用得比较多,是在.NET 3.5 IIRC中引入的。【参考方案2】:

为什么不直接使用所有 Lambda 语法?

database.Stores.Where(s => s.CompanyID == curCompany.ID)
               .Select(s => new SelectListItem
                   
                       Value = s.Name,
                       Text = s.ID
                   );

【讨论】:

【参考方案3】:

您似乎试图混合使用查询表达式语法和“普通”lambda 表达式语法。您可以使用:

IEnumerable<SelectListItem> stores =
        from store in database.Stores
        where store.CompanyID == curCompany.ID
        select new SelectListItem  Value = store.Name, Text = store.ID;
ViewBag.storeSelector = stores;

或者:

IEnumerable<SelectListItem> stores = database.Stores
        .Where(store => store.CompanyID == curCompany.ID)
        .Select(s => new SelectListItem  Value = s.Name, Text = s.ID);
ViewBag.storeSelector = stores;

你不能像你想的那样混合这两者。

【讨论】:

【参考方案4】:

Lambda 表达式结果

var storesList = context.Stores.Select(x => new  Value= x.name,Text= x.ID ).ToList();

【讨论】:

【参考方案5】:

使用 Lambda 表达式:

    如果我们没有特定的类来绑定结果:

     var stores = context.Stores.Select(x => new  x.id, x.name, x.city ).ToList();
    

    如果我们有一个特定的类,那么我们需要将结果与它绑定:

    List<SelectListItem> stores = context.Stores.Select(x => new SelectListItem  Id = x.id, Name = x.name, City = x.city ).ToList();
    

使用简单的 LINQ 表达式:

    如果我们没有特定的类来绑定结果:

    var stores = (from a in context.Stores select new  x.id, x.name, x.city ).ToList();
    

    如果我们有一个特定的类,那么我们需要将结果与它绑定:

    List<SelectListItem> stores = (from a in context.Stores select new SelectListItem Id = x.id, Name = x.name, City = x.city ).ToList();
    

【讨论】:

以上是关于如何在 LINQ 选择语句中使用 Lambda的主要内容,如果未能解决你的问题,请参考以下文章

SQL 语句到 linq lambda

如何将带有内连接的 sql 查询转换为 linq lambda 表达式?

如何使用 Lambda 或 Linq 将匿名类型转换为原始类型成员

如何使用扩展在Linq Lambda中编写此SQL

如何在 LINQ lambda 中执行多个表之间的联接

关于linq/lambda中如何使用DataDiff的问题