使用LINQ用单个列值填充字符串

时间:2019-01-09 14:48:01

标签: c# linq

我是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变量似乎是一种理想的方法。

谢谢您的协助。

4 个答案:

答案 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"];