我看过类似的问题-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; }
}
使用所有类型为Till的资产的名称来初始化FilterViewModel.AvailableTills(例如{““ 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均为空。尚未选择。
当视图使用FilterViewModel以及通过GET提交回时,选定复选框的列表将返回给FilterViewModel中的控制器。
我正在尝试做的是获取在PostTills列表中具有名称的资产的商店的列表。
因此,如果用户选择“ Front”和“ Cafe”,则我希望存储资产名为“ Front”和“ Cafe”的商店。
相反,我得到的是资产名为“ Front”(但不一定是“ Cafe”)和资产名为“ Cafe”(但不是“ Front”)的商店列表。
我正在尝试的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'类型,因为它不是委托类型”:
(a => postedTillNames.Contains(a.Name))
我也尝试过其他查询,但无法获得我想要的结果。
有人能帮忙吗?
问候
克雷格
最佳答案
您只需要输入要执行的实际表达式,而不是定义如何执行的lambda。将(a => postedTillNames.Contains(a.Name))
替换为postedTillNames.Contains(a.Name)
。
您在查询表达式的上下文中提供代码的事实意味着编译器将为您将代码包装在lambda中。它被两次包装在lambda中(一次,由您一次,由编译器一次),这就是导致此问题的原因。