【问题标题】:LINQ - using result from one in anotherLINQ - 在另一个中使用结果
【发布时间】:2016-07-21 21:14:18
【问题描述】:

我对 LINQ 完全陌生,我想将我的一些 SQL 查询重写为 LINQ(只是为了学习),但我已经卡在了开头。可能解决方案非常简单,但正如我所说,我是全新的,我没有找到解决方案。

我有一个问题:

string typMoneta = textBox1.Text;
var moneta = from x in db.grupyTowarowes
             where x.typ == typMoneta
             select new
             {
                 x.grupa
             };

哪个工作正常,什么时候设置

dataGridView1.DataSource = moneta;

Then i got output

我想在我的第二个查询中使用这个输出:

var query = from c in dbContext.Picking
            where c.Number == 1000 && c.Group == moneta
            select new
            {
                c.id
            };

c.Group == moneta 有问题。我不知道正确的语法。有人可以帮我吗?

【问题讨论】:

  • 您收到的错误是什么?
  • 我没有收到任何错误,但我显示的语法不正确,当我这样做时 moneta.ToString() 然后我得到查询而不是我的输出。
  • 查询通常不是你会比较相等的东西。你能解释一下你想在这里实现什么吗?
  • 让我再说一遍总是让初学者感到困惑的根本重要的事情:查询表达式的值是表示查询的对象。这是一个问题。查询表达式的值不是该问题的答案。你是说“这个组和这个组是同一个查询对象吗?”当我认为你想说“这个组的成员和这个查询的结果是同一组结果吗?”时?
  • 所以基本上我想做的是:我想从一个 typ=textBox.text 的数据库中选择 grupa,然后从上一个查询中选择 number==100 和 c.grupa IN grupa 的 id。

标签: c# linq


【解决方案1】:

我认为您的意思是使用moneta.Contains(c.Group)。在第一个查询中,确保使用ToList() 将数据加载到内存中。

IList<string> moneta = (from x in db.grupyTowarowes
    where x.typ == typMoneta
    select x.grupa).ToList();

var query = (from c in dbContext.Picking
    where c.Number == 1000 && moneta.Contains(c.Group) 
    select c.id).ToList();

【讨论】:

  • 我收到错误:“无法从字符串转换为
  • 在这部分:moneta.Contains(c.Group)
  • 我更新了答案。请尝试不要在两个查询中创建匿名类型 - new {}
  • 现在语法是正确的,但我的意思是没有输出,我尝试将查询加载到 dataGridView 中,但没有任何反应。
  • 数据源变成字符串数组,所以在GridView中使用DataField="!" this
【解决方案2】:

monetaIEnumerable&lt;T&gt;,在您的情况下,Tgrupa 的类型 话虽如此,您应该像下面这样编写查询:

var query = from c in dbContext.Picking
            where c.Number == 1000 
            && moneta.Contais(c.Group)
            select new
            {
                c.id
            };

或使用流利的语法,如下所示:

var query = dbContext.Picking
                     .Where(pick => pick.Number == 1000 
                                 && moneta.Contains(pick.Group))
                     .Select(pick => pick.id);

【讨论】:

  • 我收到错误:“无法从字符串转换为
  • 问题在于Group的类型和moneta中包含的类型。你能指定它们吗?谢谢
  • Group 是字符串,而 moneta 是 IEnumerable,如你所说:)
  • @takiTamNick 我怀疑moneta 的类型不是IEnumerable&lt;string&gt;。所以我认为,如果我们弄清楚moneta的类型是什么,以及moneta的项目是如何与pick.Group相关联的,那么你的问题就迎刃而解了。
  • IEnumerable moneta = (from x in db.grupyTowarowes where x.typ == typMoneta select x.grupa).ToList();所以类型是 IEnumerable,但是当我将它加载到 DataGrigView 时,我在每一行得到 20,列被命名为“Length”,而不是我之前的输出。
【解决方案3】:

请注意,moneta 不是字符串的集合。它是具有名为“grupa”的字符串属性的对象集合。

这对你有用吗?

var query =
    from c in dbContext.Picking
    where c.Number == 1000
       && moneta.Any(m => m.grupa == c.Group)
    select new { c.id };

你也可以这样做:

// Get list of strings
var groups = moneta.Select(m => m.grupa).ToList();

// Get items where "Group" value is one of the strings in groups list, above.
var query =
    from c in dbContext.Picking
    where c.Number == 1000
       && groups.Contains(c.Group)
    select new { c.id };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多