我希望将以下查询合并到一次对数据库的调用中。
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。在这种情况下,“其他”将第二个查询缩小为此简化示例中的单个结果。
答案 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;
但你真的需要单一查询吗?