【问题标题】:What is the type of this inner join LINQ query?这个内部连接 ​​LINQ 查询的类型是什么?
【发布时间】:2014-07-02 14:34:24
【问题描述】:

当程序员使用var 而不是精确并编写正确的类型时,我非常恼火。微软教程中:http://msdn.microsoft.com/en-us/library/bb397927.aspx 我找到了内部连接的解释(下)。 innerJoinQuery 的类型可能是什么,因为它看起来像是 2 个字符串的混搭,但我们不知道结果类型是什么。

引用:

连接操作在数据源中未明确建模的序列之间创建关联。例如,您可以执行联接以查找具有相同位置的所有客户和分销商。在 LINQ 中,join 子句总是针对对象集合而不是直接针对数据库表。

C#
var innerJoinQuery =
    from cust in customers
    join dist in distributors on cust.City equals dist.City
    select new { CustomerName = cust.Name, DistributorName = dist.Name };

在 LINQ 中,您不必像在 SQL 中那样经常使用连接,因为 LINQ 中的外键在对象模型中表示为包含项目集合的属性。例如,一个 Customer 对象包含一个 Order 对象的集合。您无需执行连接,而是使用点符号访问订单:

编辑:让我们重新表述这个问题。除了var,我还能在这里放什么?

【问题讨论】:

  • 它的某种形式的ienumerable<annontype>
  • 在这种情况下你必须使用var
  • 没有类型推断 (var) 就没有 LINQ
  • 您可以输入dynamic,但这会破坏编译器。或者您可以让它选择您定义的新类型。
  • “这让我非常恼火”...我建议你克服你的烦恼并接受匿名类型。没有它们,Linq 将成为主要的 PITA。使用它们不会放弃任何类型安全。

标签: c# sql linq join


【解决方案1】:

此 linq 查询的结果是具有两个属性的匿名类型对象的序列。其中一个称为CustomerName,另一个称为DistributorName。它们都很可能是string 类型。

为了避免var,您必须声明一个具有这两个属性的类,如下所示:

class ClassName
{
    public string CustomerName { get; set; }
    public string DistributorName { get; set; }
}

然后您必须将 linq 查询更改为以下查询:

IEnumerable<ClassName> innerJoinQuery =  from cust in customers
                                         join dist in distributors 
                                         on cust.City equals dist.City
                                         select new ClassName 
                                         { 
                                             CustomerName = cust.Name, 
                                             DistributorName = dist.Name 
                                         };

但是,如果您只是想获取此查询的结果并遍历它们或其他内容,我认为上述方法没有任何好处。换句话说,我认为var在这里使用正确。我的意思是它不会对你所做的事情产生任何歧义。

【讨论】:

  • 使用 var 总是正确的类型。编译器推断它!
  • @Yoda 它实际上是一个非常聪明的概念。 c++ 将其引入为auto
  • @Yoda var != dynamic.
  • @Yoda 除了var,你还可以使用其他一些东西,但是它们都不能让你有效地利用匿名类型,所以对于所有实际目的,是的,这是你唯一的选择有。如果你不喜欢它,那是你的选择,你当然可以不使用它。你基本上也永远无法使用匿名类型。
  • @Yoda 看起来 java 在 7 中有它,但在恕我直言,看起来更可怕 - MyClass&lt;Integer&gt; myObject = new MyClass&lt;&gt;("");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2013-10-30
  • 2018-12-10
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多