【问题标题】:Operator '==' cannot be applied to operands of type 'int' and 'System.Linq.iQueryable<int>'运算符“==”不能应用于“int”和“System.Linq.iQueryable<int>”类型的操作数
【发布时间】:2013-04-21 13:19:49
【问题描述】:

所以我有点卡住了!为大学做编程作业,我碰壁了。

我们在其中一个部分中得到的问题如下:

"2. 允许用户查找在特定年份下订单的客户。提供一个 组合框,其中列出了订单表中的所有唯一(不同)年份,用户可以从中 做出选择。”

我在转换“年份”时遇到问题,因此我可以将其与 OrderID 进行比较,并在列表框中显示数据库中的所有订单。

如果有人能帮我一把,将不胜感激! 谢谢!

这是我的代码:

private void dateDDL_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string selection;
    selection = dateDDL.SelectedItem.ToString();

    var year = from y in northwind.Orders
               where Convert.ToString(y.OrderDate).Contains(selection)
               select y.OrderID;

    var order = from o in northwind.Order_Details
                where o.OrderID == year
                select new { o.OrderID, 
                             o.ProductID, 
                             o.UnitPrice, 
                             o.Quantity, 
                             o.Discount };

    lbxOrderdate.ItemsSource = order;
}  

【问题讨论】:

  • 您正在将查询的结果与整数进行比较。您需要使用 First()Single() 之类的查询从查询​​中获取值,然后进行比较
  • var 关键字陷阱 :-) 它并不总是适合代码可读性。如果你写了IQueryable&lt;int&gt; year,也许你会看到这个问题,所以你看到那不是int
  • @polkduran:最好适当地命名变量。
  • +1 @siride ,是的,你是对的
  • 我个人会将dateDDL.SelectedItem 转换为int。那么您就不需要执行 Convert.ToString(),这可能会生成次优 SQL。

标签: c# sql linq


【解决方案1】:

您的 year 查询将返回与您的 where 子句匹配的所有 OrderID 值的列表。您无法将该列表与 order 查询中的单个 o.OrderID 进行比较;如果您想查找 years 查询返回的某一年中的所有订单,请使用类似

where year.Contains(o.OrderID)

(未经测试,但应该会引导您走上正确的道路)

【讨论】:

  • 这太完美了!正是我想要的。如您所见,仍然是一个菜鸟编程,但至少它会完成需要做的事情!谢谢先生。
  • 不用担心 - 不客气。如果您将 year 查询重命名为更准确的描述性名称,例如 orderIDList,您可能会发现代码更易于阅读
【解决方案2】:
var year = (from y in northwind.Orders
                   where Convert.ToString(y.OrderDate).Contains(selection)
                   select y.OrderID).Single();

var order = from o in northwind.Order_Details
                    where o.OrderID == year
                    select new { 
                                  o.OrderID, 
                                  o.ProductID, 
                                  o.UnitPrice, 
                                  o.Quantity, 
                                  o.Discount 
                                };

LINQ 查询也返回System.Linq.IQueryable&lt;T&gt;,如果你想取单个值,你应该Single()/First() 扩展。

如果您不确定该查询结果是否包含对象,您应该FirstOrDefault()SingleOrDefault()(当集合仅包含一个元素时SingleOrDefault() 抛出异常),如果存在则返回default(T)结果中没有元素。请注意这一点。

【讨论】:

  • 这将产生 2 个数据库调用。次优。
  • @Aron:是的,但这个问题与 LINQ 查询映射无关
  • 我的观点很简单。如果您内联查询或避免使用 Single 调用(如其他人所指出的那样使用 contains),您将拥有一个接受单个数据库调用的查询。不了解抽象层是如何工作的会导致像这样的问题 - EF slow performance due to lazy loading
【解决方案3】:

类型非常重要,(除了)字符串的世界是不安全的。

string selection = dateDDL.SelectedItem.ToString();
int year = Int32.Parse(selection);

var orders =
  from order in northwind.Orders
  where order.OrderDate.Year == year
  select order;

"2. 允许用户查找在特定年份下订单的客户。提供一个组合框,其中列出了订单表中所有唯一(不同)年份,用户可以从中进行选择。"

嗯,查询不应该是关于客户的吗?

【讨论】:

  • 你是对的。好地方:O。我真的需要学习如何更好地阅读问题>.>
猜你喜欢
  • 2017-09-02
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 2015-01-25
  • 2011-12-31
  • 2022-01-07
相关资源
最近更新 更多