2010-04-16 56 views
0

我想弄清楚如何做一系列的查询来获取更新,删除和插入隔离到自己的调用。我有2个表,每个数据库都有一个表。一个是只读饲料数据库,另一个是T-SQL R/W生产源。有两个两个共同的列。使用C#和LINQ的左/右/内部连接

我在做什么设置是这样的:

List<model.AutoWithImage> feedProductList = _dbFeed.AutoWithImage.Where(a => a.ClientID == ClientID).ToList(); 
List<model.vwCompanyDetails> companyDetailList = _dbRiv.vwCompanyDetails.Where(a => a.ClientID == ClientID).ToList(); 
foreach (model.vwCompanyDetails companyDetail in companyDetailList) 
{ 
    List<model.Product> productList = _dbRiv.Product.Include("Company").Where(a => a.Company.CompanyId == companyDetail.CompanyId).ToList(); 
} 

现在,我已经从饲料产品(源)列表中,并从我的督促数据库I”的产品现有的(目标)列表倒要做3两件事:

  1. 找到所有的SKU饲料不在目标
  2. 找到所有的SKU是两个,是活跃的饲料产品和更新目标
  3. 找到所有的SKU是两个,是不活跃从目标

什么是这样做不运行的双循环的最佳实践软删除?我更喜欢LINQ 4 Objects解决方案,因为我已经有了我的对象。

编辑:顺便说一句,我需要将信息从饲料行转移到前2个实例中的目标行,只需在最后一个实例中设置一个标志。

TIA

回答

1

的LINQ到对象的做法会是这样的示范。在这里我有两个字符串列表,我想拉比赛,alphas中的元素不在beta中,而beta中的元素不在alphas中。 LINQ语法非常简单。

List<string> alphas = new List<string>() { "a", "b", "c", "d", "e" }; 
List<string> betas = new List<string>() { "a", "c", "e", "g", "i" }; 

var matches = from alpha in alphas 
       join beta in betas 
       on alpha equals beta 
       select alpha; 

var noBetas = from alpha in alphas 
       join beta in betas 
       on alpha equals beta 
       into gj 
       from b in gj.DefaultIfEmpty() 
       where b == null 
       select alpha; 

var noAlphas = from beta in betas 
       join alpha in alphas 
       on beta equals alpha 
       into gj 
       from a in gj.DefaultIfEmpty() 
       where a == null 
       select beta; 

每个的结果是一个IEnumerable<string>,并遍历火柴将揭示A,C,和e。 noBetas会产生b和d。 noAlphas会产生g和i。

我相信这就是你要求的。通过加入关键字段将其应用于您的对象列表,而不是一个字符串与另一个字符串相等的简单场景。

+0

花了我很多的手脚,但我想我已经明白了。不幸的是,我的要求改变了 - 两次 - 今天。 :| 感谢您的建议... – 2010-04-19 21:38:44