我看过类似的问题 - id 不是字符串 - 但它对我不起作用,所以我重新发布。
商店模式:
public class Store
{
public int ID { get; set; }
public virtual IList<Asset> Assets { get; set; }
}
直到:
public class Till
{
public int ID { get; set; }
[ForeignKey("Store")]
public int StoreID { get; set; }
public virtual Store Store { get; set; }
public int Type { get; set; }
public string Kind { get; set; }
public string Name { get; set; }
}
使用 MvcCheckBoxList 引用库,我有一个包含名称列表的 FilterViewModel:
public class FilterViewModel
{
public IEnumerable<TillCheckBox> AvailableTills { get; set; }
public IEnumerable<TillCheckBox> SelectedTills { get; set; }
public PostedTills PostedTills { get; set; }
}
public class PostedTills
{
public string[] TillNames { get; set; }
}
FilterViewModel.AvailableTills 使用 Till 类型的所有 Assets 的名称进行初始化(例如 { "Front", "Back", "Floor", "Shop", "Cafe"}):
private List<string> GetAllTills()
{
return (from a in _db.Assets where (a.Kind == "Till") select a.Name).Distinct().ToList();
}
FilterViewModel.SelectedTills 和 FilterViewModel.PostedTills 都是空的。尚未选择任何内容。
当 View 使用 FilterViewModel 并通过 GET 将选定复选框的列表提交回 FilterViewModel 中的 Controller 时。
我想要做的是获取具有 PostedTills 列表中名称的 Assets 的商店列表。
因此,如果用户选择“Front”和“Cafe”,我想要具有名为“Front”和“Cafe”的 Assets 的商店。
相反,我得到的是一个商店列表,其中包含名为“Front”(但不一定是“Cafe”)的 Assets 和名为“Cafe”(但不是“Front”)的 Assets 。
我正在尝试的 Linq 查询(基于其他帖子)是:
stores = (from s in db.Stores
join a in db.Assets on s.ID equals a.StoreID
where (a => postedTillNames.Contains(a.Name))
select s).Distinct().ToList();
但这会出现错误“无法将 lambda 表达式转换为类型‘bool’,因为它不是委托(delegate)类型”:
(a => postedTillNames.Contains(a.Name))
我也尝试了不同的查询,但无法得到我想要的结果。
有谁可以帮忙吗?
问候 克雷格
最佳答案
您只需输入要执行的实际表达式,而不是定义如何执行的 lambda。将 (a => postsTillNames.Contains(a.Name))
替换为 postedTillNames.Contains(a.Name)
。
您在查询表达式的上下文中提供代码这一事实意味着编译器将为您将代码包装在 lambda 中。它两次将其包装在 lambda 中(一次由您,一次由编译器),这就是导致问题的原因。
关于c# - 使用 LINQ 根据字符串列表选择多个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240509/