Linq to sql 如何在使用Linq2Sql的方法中确定返回类型?

Linq to sql 如何在使用Linq2Sql的方法中确定返回类型?,linq-to-sql,Linq To Sql,当涉及linq时,我通常很难处理返回类型。我将用下面的例子来解释。假设我有一个表Products,其中ProductID、Name、Category和Price列为: 1可更换的** 现在,如果我决定只选择一列Price或Name,甚至2列或3列Name和Price,但无论如何,少于4列,返回类型是什么 我的意思是: public returnType GetSomeInformation() { return (from pd in db.Products select n

当涉及linq时,我通常很难处理返回类型。我将用下面的例子来解释。假设我有一个表Products,其中ProductID、Name、Category和Price列为:

1可更换的**

现在,如果我决定只选择一列Price或Name,甚至2列或3列Name和Price,但无论如何,少于4列,返回类型是什么

我的意思是:

public returnType GetSomeInformation()
{
 return (from pd in db.Products
         select new { pd.Name, pd.Price }
}
GetSomeInformation的返回类型应该是什么

谢谢你的帮助

简短回答:IEnumerable

长答覆:

您返回的是的集合,因此需要返回类型为IEnumerable。

简短回答:IEnumerable

长答覆:


返回的是的集合,因此需要返回类型为IEnumerable。

如果选择多个列,而不是完整对象,LINQ将返回通用对象。如果希望通过函数返回该数据子集,则需要创建自己的类并按如下方式加载:

public class MyObject
{
  public string Name { get; set; }
  public double Price { get; set; }
}

public MyObject GetSomeInformation()
{
 return (from pd in db.Products
         select new  MyObject {
           Name = pd.Name, 
           Price = pd.Price 
         }).FirstOrDefault();
}

如果选择多个列,但不选择完整对象,LINQ将返回通用对象。如果希望通过函数返回该数据子集,则需要创建自己的类并按如下方式加载:

public class MyObject
{
  public string Name { get; set; }
  public double Price { get; set; }
}

public MyObject GetSomeInformation()
{
 return (from pd in db.Products
         select new  MyObject {
           Name = pd.Name, 
           Price = pd.Price 
         }).FirstOrDefault();
}
您不能在此上下文中使用var,因为当前只能在局部变量中推断类型

因此,要么:

将Select部件移动到调用方,并返回一个普通IQueryable:

创建一个returntype ProductInformation,它只包含您需要的信息:

class ProductInformation
{
  public string Name { get; set; }
  public decimal Price { get; set; }
}

public IQueryable<ProductInformation> GetSomeInformation()
{
  return (from pd in db.Products
          select new ProductInformation { Name=pd.Name, Price=pd.Price });
}
您不能在此上下文中使用var,因为当前只能在局部变量中推断类型

因此,要么:

将Select部件移动到调用方,并返回一个普通IQueryable:

创建一个returntype ProductInformation,它只包含您需要的信息:

class ProductInformation
{
  public string Name { get; set; }
  public decimal Price { get; set; }
}

public IQueryable<ProductInformation> GetSomeInformation()
{
  return (from pd in db.Products
          select new ProductInformation { Name=pd.Name, Price=pd.Price });
}

您建议如何获取非类型化匿名类型的属性值?不要说反省-这是我在C语言中最讨厌的一件事,就是缺少动态成员解析。VB.NET从.NET 1.0开始就有这个功能。真是太好了。现在每个人都在谈论动态,就像第二次来临一样。天哪。。。它已经存在了很长时间。Tbh,我认为实施DLR只是达到目的的一种手段。这使我可以少做一些烦人的COM互操作,并调用动态语言资源。但我不认为我自己在其他方面使用dynamic关键字。在使用dynamic member resolution的所有原因中,这是最糟糕的原因之一。如果类型推断算法允许您在不声明类的情况下返回类型化结果,那就太好了。@erikkallen问题是,Erik,VB从VB3到Win3.1都有这种功能,从VB.NET到1.0都有这种功能。所有解析都是动态完成的。当然,您不能像处理动态类型那样创建新成员,但您可以调用任何您想要的现有成员。您建议如何获取非类型化匿名类型的属性值?不要说反省-这是我在C语言中最讨厌的一件事,就是缺少动态成员解析。VB.NET从.NET 1.0开始就有这个功能。真是太好了。现在每个人都在谈论动态,就像第二次来临一样。天哪。。。它已经存在了很长时间。Tbh,我认为实施DLR只是达到目的的一种手段。这使我可以少做一些烦人的COM互操作,并调用动态语言资源。但我不认为我自己在其他方面使用dynamic关键字。在使用dynamic member resolution的所有原因中,这是最糟糕的原因之一。如果类型推断算法允许您在不声明类的情况下返回类型化结果,那就太好了。@erikkallen问题是,Erik,VB从VB3到Win3.1都有这种功能,从VB.NET到1.0都有这种功能。所有解析都是动态完成的。当然,你不能像处理动态类型那样创建新成员,但你可以调用任何你想要的现有成员。@Charles Boyung-如果我决定只查询一列,例如,选择pd.name怎么样。我是否需要创建一个包含一个属性的类?或者我可以使用简单类型,比如string、int、bool等?是的,如果您只需要一个列,那么您可以使用该列的任何.Net类型。如果您不确定,该列的VS intellisense将在您编写代码时告诉您类型。@Charles Boyung-如果我决定只查询一列,例如,选择pd.name如何。我是否需要创建一个包含一个属性的类?或者我可以使用简单类型,比如string、int、bool等?是的,如果您只需要一个列,那么您可以使用该列的任何.Net类型。如果您不确定,该列的VS intellisense将在您编写代码时告诉您类型。@Yannick M.-如果我决定查询ProductID和Category而不是Name和Price,我是否需要创建另一个包含这两列的类?如果需要,您可以让您的类包含所有四个字段
如果需要,只设置需要使用的字段。或者,您可以根据为每个LINQ请求返回的字段创建多个类。我更喜欢第一个选项,即只有一个类并设置所需的字段。如果这是真的,我可以使用Product而不是上面示例中的ProductInformation吗?ii0如果我可以使用Product而不是ProductInformation,我需要用'Name=pd.Name'来代替'Name'吗?另外,从上面的语句var information=GetProductInformation.Selectp=>new{p.Name,p.Price},我如何使用动态查询字符串来替换p=>new{p.Name,p.Price由一个字符串表示。我该怎么做?为此,请查看Dynamic Linq:@Yannick M.-如果我决定查询ProductID和Category而不是Name和Price,我是否需要创建另一个包含这两列的类?如果需要,可以让您的类包含所有四个字段,如果需要,只设置需要使用的字段。或者可以根据为每个LINQ请求返回的字段创建多个类。我更喜欢第一个选项,即只有一个类并设置所需的字段。如果是这样,我可以在上面的示例中使用Product而不是ProductInformation吗?ii0如果我可以使用Product而不是ProductInformation,我是否需要“Name=pd.Name”就位对于“Name”?另外,从上面的语句var information=GetProductInformation.Selectp=>new{p.Name,p.Price},我如何使用动态查询字符串替换p=>new{p.Name,p.Price为字符串。我该如何做?为此,请查看动态Linq:
class ProductInformation
{
  public string Name { get; set; }
  public decimal Price { get; set; }
}

public IQueryable<ProductInformation> GetSomeInformation()
{
  return (from pd in db.Products
          select new ProductInformation { Name=pd.Name, Price=pd.Price });
}