如何在 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 => store.CompanyID == curCompany.ID)
是 Func lamda 表达式类型???
@Kgn-web 使用Action<T>
当你想传递一个不返回值的委托和Predicate<T>
委托你需要返回一个布尔值; Predicate<T>
是在.NET 2.0中引入的,一般Func<T, bool>
用得比较多,是在.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 表达式?