在LINQ中自动连接外键的最有效方法

时间:2009-06-19 10:27:50

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

我有两个表用于跟踪我网站上的用户会话。这是一个粗略的过度简化btw:

 Campaign:
     campaignId    [int]
     campaignKey   [varchar(20)]
     description   [varchar(50)]

 Session:
     sessionDate   [datetime]
     sessionGUID   [uniqueidentifier]
     campaignId    [int]
     campaignKey   [varchar(20)]

我想使用LINQ:

在Session中插入一条新记录
     var s = new Session();
     dbContext.Session.InsertOnSubmit(s);

     s.sessionDate = DateTime.Now;
     s.sessionGUID = Guid.NewGuid();
     s.campaignKey = Request.Params["c"];
     // dont set s.campaignId here...

     dbContext.SubmitChanges();

请注意,我目前没有在此代码中设置campaignId

我想要的是某些自动将外键连接到'Campaign'表,如果广告系列传入,它必须首先向'Campaign'表添加新行以前从未使用过。

我有一些决定要做,并且非常感谢对其中任何一个的见解:

  • 我不知道是否应该使用触发器,存储过程或在LINQ中手动执行:

    • 触发:稍微icky,从不真正喜欢使用它们,但会保证'campaignId'在我需要时更新

    • 存储过程:再次稍微icky,我的SQL不是很好,我重视能够尽可能地在LINQ中做所有事情的一致性。

    • Linq手动:我必须在内存中保留“Campaign”表的副本,并使用C#哈希表进行查找。如果另一个客户添加了一个新的广告系列,我就不得不担心让该表保持最新状态。

  • 我想要这个外键表的两个主要原因是为'campaignId'的'Session'提供更高效的索引,以便我可以更快地进行分组。如果它只是一个整数列被分组,它似乎应该快得多。第二个原因是为合作伙伴授予权限,以便仅通过与其他表的连接来查看其广告系列。

在有人询问之前我不提前知道这些活动,因为有些活动会由合作伙伴创建。

最重要的是:我主要寻找最“友好的LINQ”解决方案。

1 个答案:

答案 0 :(得分:1)

我肯定会建议在Session表上添加一个可以为空的外键约束。一旦你有了这个设置,它应该像在Session类的方法上一样简单:

public partial class Session
{
    public void SetCampaignKey(string key)
    {
        // Use an existing campaign if one exists
            Campaign campaign =
            from c in dbContext.Campaigns
            where c.campaignKey == key
            select c;

        // Create a new campaign if necessary
        if (campaign == null)
        {
            campaign = new Campaign();
            campaign.campaignKey = key;
            campaign.description = string.Empty; // Not sure where this comes in
            dbContext.Campaign.InsertOnSubmit(campaign);
        }

        // We can now set the reference directly
        this.Campaign = campaign;
    }
}

我的LINQ可能有点偏,但这样的事情应该有用。

您可以调用SetCampaignKey()而不是手动设置campaignKey属性。当您调用dbContext.SubmitChanges时,将根据需要添加活动,并且会话条目将相应更新。

在这种情况下,只会自动设置campaignId属性。您可以依靠简单的触发器来设置campaignKey或取消它。您始终可以通过加入Campaign表来检索该值。

我是否过度简化了问题?