我是C#和LINQ的新手,希望能朝正确的方向努力。
首先,我有一个Overrides SQL表(和一个对应的EF DB上下文),该表具有Type,Value和Override Value。想法是,对于特定类型的替代(“类型”),代码可以检查特定值,然后查看是否应使用替代值。
var branchOverrides = overridesSqlContext.Overrides
.Where(q => q.Type == "Branch Override")
.Select(s => new
{
s.Value,
s.OverrideValue
});
在这种情况下,我需要“ Branch Override”类型的不同替代值的列表。从那里,我希望能够在代码中的给定点检索特定的覆盖值。如何查询我创建的branchOverrides变量,以便能够说出类似的内容:
string readingOverride = select OverrideValue from branchOverrides where Value = "Reading"
我的代码将需要能够在不同点读取不同分支的各种覆盖值,并且能够在任何点查询branchOverrides变量似乎是一种理想的方法。
谢谢您的协助。
答案 0 :(得分:2)
您可以在拥有的查询对象上使用Single()
:
string readingOverride = branchOverrides
.Single(bo => bo.Value == "Reading")
.OverrideValue;
如果条目不存在,这将引发异常,因此您可能想改用SingleOrDefault
并检查是否为空。
还要注意,这里的branchOverrides
对象是一个IQueryable<>
,这意味着每次使用它时,它将向数据库发送查询。您可能希望通过在.ToList()
之后添加Select(...)
将其具体化为本地列表。另外,您可能希望查看对这些数据进行缓存,特别是如果它们将经常使用时。
答案 1 :(得分:1)
如果我理解正确,那么您希望输入的值为Value =“ Reading”且Type =“ Branch Override”:
var branchOverride = overridesSqlContext.Overrides
.SingleOrdDefault(q => q.Type == "Branch Override"
&& q.Value == "Reading")
.Select(s => new
{
s.Value,
s.OverrideValue
});
if (branchOverride != null)
{
// do whatever ...
}
答案 2 :(得分:1)
由于性能问题,如果您需要多次遍历该列表,最好在LINQ表达式的末尾放置.ToList()。
var branchOverrides = overridesSqlContext.Overrides
.Where(q => q.Type == "Branch Override")
.Select(s => new
{
s.Value,
s.OverrideValue
}).ToList();
如果需要,则将整个列表加载到内存中,从而避免在需要遍历列表时执行sql查询来获取数据。
您可以做的其他事情是:
string readingOverride = string.Empty;
var branchOverride = branchOverrides.FirstOrDefault(x => x.Value == "Reading");
if(branchOverride != null)
{
readingOverride = branchOverride.OverrideValue;
}
希望有帮助。
答案 3 :(得分:0)
如果Value
在“分支覆盖”中是唯一的,则您可能希望将其变成字典以快速查找
var branchOverrides = overridesSqlContext.Overrides
.Where(q => q.Type == "Branch Override")
.Select(s => new
{
s.Value,
s.OverrideValue
})
.ToDictionary(k => k.Value, v => v.OverrideValue);
随后,您可以快速有效地找到替代值
var readingOverride = branchOverrides["Reading"];