将LINQ查询与方法语法相结合

时间:2018-05-08 14:01:27

标签: c# linq

我希望将以下查询合并到一次对数据库的调用中。

string name = Item
              .Where(x => x.ItemID == 180)
              .Select(x => x.ItemName).FirstOrDefault();

int itemID = Item
             .Where(x => x.ItemName == name && x.Other == 50)
             .Select(x => x.ItemID).FirstOrDefault();

这几乎是使用它的ID获取名称,并使用该名称获取具有相同名称的另一行的ID。在这种情况下,“其他”将第二个查询缩小为此简化示例中的单个结果。

5 个答案:

答案 0 :(得分:1)

这应该有效:

int itemID = Item.Where(x => x.ItemName == Item.Where(y => y.ItemID == 180)
                 .Select(y => y.ItemName).FirstOrDefault() && x.Other == 50)
                 .Select(x=>x.ItemID)
                 .FirstOrDefault();

答案 1 :(得分:1)

如果您选择使用加入,这是一个完整的工作示例。

示例数据:

        List<Item> Items = new List<Item>()
        {
            new Item { ItemId = 1, ItemName = "Item1", Other = 1 },
            new Item { ItemId = 2, ItemName = "Item2", Other = 2 },
            new Item { ItemId = 3, ItemName = "Item3", Other = 3 },
            new Item { ItemId = 4, ItemName = "Item4", Other = 4 },
            new Item { ItemId = 5, ItemName = "Item5", Other = 5 },
            new Item { ItemId = 6, ItemName = "Item6", Other = 6 },
            new Item { ItemId = 7, ItemName = "MyExpectedName", Other = 50 },
            new Item { ItemId = 8, ItemName = "MyExpectedName", Other = 50 },
            new Item { ItemId = 180, ItemName = "MyExpectedName", Other = 8 },
        };

使用Join的示例查询:

        var itemId = Items
            .Join(Items.Where(a => a.ItemId == 180), x => x.ItemName, y => y.ItemName, (x, y) => x)
            .Where(x => x.Other == 50)
            .Select(x => x.ItemId)
            .FirstOrDefault();

请注意,在此示例中,您将获得与提供的ItemID为180不同的ItemID。在这种情况下,由于我静态创建此列表作为示例,我知道每次都会返回ItemID为7。但是,如果针对底层数据库运行此查询,则数据库可能无法返回ItemID排序的项目(除非您使用OrderedBy子句明确告知它)。因此,有可能ItemId = 8可以作为第一个记录集而不是7从数据库返回。

答案 2 :(得分:0)

可以简化:

    var name = Items.FirstOrDefault(x => x.ItemID == 180)?.ItemName;
    var id = Items.FirstOrDefault(x => x.ItemName == name && x.Other == 50)?.ItemID;

答案 3 :(得分:0)

这会找到ItemName项目的ItemID,并使用它按此值过滤所有项目。

int itemID = (from i in Item
              where i.ItemName = (
                 from j in Item
                 where j.ItemID == 180
                 select j.ItemName).FirstOrDefault()
              && j.Other == 50
              select i.ItemID).FirstOrDefault();

这是查询语法,我发现它更容易阅读,但如果您愿意,转换为方法调用语法并不复杂。如果你有ReSharper可以自动完成它。

答案 4 :(得分:-1)

这样的事情:

Item
  .Join(Item, x => x.Name, x => x.Name, (x1, x2) => new {x1, x2})
  .FirstOrDefault(arg => arg.x1.ItemID == 180 && arg.x2.Other == 50)?.x2.ItemID;

但你真的需要单一查询吗?

相关问题