【问题标题】:How To Define The Return Type In A Function With LINQ?如何使用 LINQ 在函数中定义返回类型?
【发布时间】:2009-05-17 22:44:42
【问题描述】:

我想知道如何在函数中定义返回类型 以下情况。

我有一个产品,我一次返回所有信息或一个产品。

正如您在下面定义的函数中看到的那样。

public static Products GetProducts(int pid) 
{
    var pro = from p in context.Products
              select p;

    if(pid > 0)
        pro =  pro.where(p => p.ProductID ==pid)

    return (Products)p;
}

问题是它给了我投射错误。如您所见,我想要实现的是基于我的参数,它给了我一个结果集。有时是一堆产品,有时是单一产品。我是 linq 的新手,因此我们将不胜感激。

错误是无法将类型为“System.Data.Objects.ObjectQuery`1[TTDCore.Theatres]”的对象转换为类型“TTDCore.Theatres”

当我将它绑定到 gridview 时。这是代码

Products p = Class1.GetProducts(0);

GridView1.DataSource = p;
GridView1.DataBind();

【问题讨论】:

    标签: c# asp.net linq linq-to-sql entity-framework


    【解决方案1】:

    您想要返回IEnumerable<Product>,它表示Product 类型的对象的可迭代(或可枚举)。 LINQ 通常都基于这种泛型类型,因此它通常是您希望作为查询结果返回的内容。

    我相信你的代码应该被修复成这样:

    public static IEnumerable<Products> GetProducts(int pid) 
    {
        var pro = from p in context.Products
                  select p;
    
        if(pid > 0)
            pro =  pro.Where(p => p.ProductID == pid)
    
        return pro;
    }
    

    如果您的问题有其他意思,请告诉我。我不完全确定您到底在寻找什么。

    【讨论】:

    • 是的,这正是我想要的。只是一个快速的我试过这个&它在gridview上运行良好。但是如果在返回单条记录的情况下。我这样做是正确的方式吗?产品 p = (Products)Class1.GetProducts(1).FirstOrDefault(); Response.Write(p.ProductName);它的作品只是想知道它是否是正确的方法。感谢您的快速响应。
    • 啊,很好。 :) 是的,您建议的返回单个记录的方法应该可以正常工作。根据情况,First/FirstOrDefault 或 Single/SingleOrDefault 扩展方法是合适的。如果有 more 个匹配项,后者(Single)将抛出异常,而前者(First)当然只返回第一个,然后停止枚举。 OrDefault 位只是意味着如果没有匹配项则返回默认值(引用类型为 null),而不是抛出异常。
    • 查询也可以只表示为一个表达式:from p in context.Products where p.ProductID == pid && pid > 0 select p
    【解决方案2】:

    我喜欢明确地使用 Linq 查询和 lambda。我建议将您的函数定义为 List(或 IEnumerable),然后将 .ToList() 添加到 where 语句中。我假设 Products 类型是某种集合?

    【讨论】:

    • 产品是我的 sql 服务器数据库中的表 = 实体框架中的实体类。你有什么建议是玩这个场景的最佳方式。
    • 好吧,我认为您不需要将函数的返回类型定义为Products。您在查询中指定产品,这就足够了。因此,如果我正确理解目标,您的返回类型应该是 IEnumerable 或 List。它们会很好地绑定到您的 GridView。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多