【问题标题】:Writing a Lambda expression with a where clause in ASP.NET MVC4/EF CodeFIrst在 ASP.NET MVC4/EF CodeFIrst 中使用 where 子句编写 Lambda 表达式
【发布时间】:2012-12-11 18:13:05
【问题描述】:

这是我的硬件课程的一部分:

public class Hardware
    {
        public int Id { get; set; }

        public virtual ICollection<HardwareType> HardwareType { get; set; }
         ....
    }

在播种的样本数据中,硬件是这样更新的(部分):

new Hardware { ... HardwareType = htype.Where(h => h.HType == "PC").ToArray() }

htype 是一个List&lt;HardwareType&gt;,其中HType 具有各种字符串值,这是HardwareType 类中的属性。

在我的控制器中,我试图将 Lambda 表达式分配给一个变量,以便在我的视图中循环遍历它。这是我所拥有的:

private Context db = new Context();  

public ActionResult Index() {
    Hardware Pcs = db.Hardware.Where(h => h.HardwareType == "PC");
}

但是编译器告诉我我不能这样做,因为h.HardwareType 是一个 iCollection。这是有道理的。但是如何编写这行代码,以便将Pcs 传递给我的视图?

【问题讨论】:

    标签: lambda asp.net-mvc-4 ef-code-first


    【解决方案1】:

    我只在 ICollection 是字符串类型而不是自定义类型的情况下这样做,但相同的解决方案可能对您有用。你没有分享你对 HardwareType 的定义,所以我的语法可能不是 100% 正确,但它应该给你这个想法。

    public ActionResult Index() {
    
        HardwareType hwt = new HardwareType { HType = "PC" };
    
        Hardware Pcs = db.Hardware.Where(h => h.HardwareType.Contains(hwt));
    }
    

    这应该会为您提供所有与您定义相关的 HardwareType 的 Hardware 对象。同样,我只使用简单的字符串来完成此操作,但我认为它也会以这种方式工作。

    这是一个可能有帮助的类似问题:How to do an "in" query in entity framework?

    【讨论】:

    • 我收到了您建议的错误:错误 18 无法将类型“System.Linq.IQueryable”隐式转换为“CIT.Models.Hardware”。存在显式转换(您是否缺少演员表?)。有什么建议吗?
    • 知道了。 IQueryable&lt;Hardware&gt; Pcs = db.Hardware.Where(h =&gt; h.HardwareType.Contains(hwt));
    • @sehummel 如果您不想返回 IQueryable,您可以执行 Hardware Pcs = db.Hardware.Where(h =&gt; h.HardwareType.Contains(hwt)).FirstOrDefault(); 或 'List Pcs = db.Hardware.Where(h => h.HardwareType.Contains( hwt)).ToList();` 取决于你想要一个或多个结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2014-02-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多