C#,LINQ,SQL:复合列

时间:2009-09-21 08:57:47

标签: c# sql-server linq-to-sql

我有一个LINQ实体,我需要为其创建一个特殊的字符串值。它是由“ - ”分隔的7个不同值。使用的一些字段位于该表中,而其中一些字段位于不同的表中。我想以某种方式将这个字段添加到实体中,这样我就不必在每次需要时自己创建这个字符串。

我以为我可以将它添加到具有如下部分类的实体:

    public string SpecialField
    {
        get
        {
            return string.Format("{0}-{1}-{2}-{3}-{4}-{5}-{6}",
                                 TableId,
                                 Number,
                                 ForeignTableA.Date,
                                 ForeignTableB.Name,
                                 ForeignTableC.ForeignTableD.Name,
                                 ForeignTableB.ForeignTableE.Name,
                                 ForeignTableB.Number ?? 0);
        }
    }

然而,在写完之后,我有点不确定这是怎么回事。原因,除非我弄错了,否则每次为每个项使用该值时都会导致数据库查询。例如,它可以在Where子句中使用该字段吗?

我需要在Where子句中使用该字段,我希望它发生在服务器上,所以我不会获取比我需要的更多的数据。

你最好怎么做?

3 个答案:

答案 0 :(得分:2)

您可以在数据库中为此创建一个视图。通过这种方式,SQL Server可以处理它,您可以更有效地查询它

答案 1 :(得分:1)

我认为你需要一个带有一些匿名类型的let子句。我没有对此进行过测试,但是这样的事情可能会有所帮助:

var query = from master in MasterTable
            join foreignA in ForeignTableA on ...
            join foreignB in ForeignTableB on ...
            let special = string.Format ("...", master.TableID, ...)
            where special.Contains ("foo")
            select { 
                 // ...
                 string specialResult = special,
                 // ...
            }

答案 2 :(得分:0)

在阅读一次之后如何缓存值?它不会像你一次获得所有这些值那样超高效,但它会阻止多次尝试获得相同的值。 (当然,这只有在使用时SpecialField内容不会改变时才有效。)

protected string specialField = null;

public string SpecialField
{
    get
    {
        if (specialField == null)
        {
            specialField = string.Format("{0}-{1}-{2}-{3}-{4}-{5}-{6}",
                             TableId,
                             Number,
                             ForeignTableA.Date,
                             ForeignTableB.Name,
                             ForeignTableC.ForeignTableD.Name,
                             ForeignTableB.ForeignTableE.Name,
                             ForeignTableB.Number ?? 0);
        }
        return specialField;
    }
}