使用C#和LINQ进行左/右/内连接

时间:2010-04-16 20:54:59

标签: c# linq-to-entities linq-to-objects set

我试图弄清楚如何进行一系列查询以将更新,删除和插入分离到自己的调用中。我有2个表,每个表有2个数据库。一个是Read Only feed数据库,另一个是T-SQL R / W Production源。两者之间有一些列。

我正在设置的是:

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();
}

现在我有一个来自Feed的产品(源)列表,以及来自我的prod DB的现有(目标)产品列表,我想做三件事:

  1. 查找Feed中不在目标
  2. 中的所有SKU
  3. 查找两者中的所有SKU,即活动Feed产品并更新目标
  4. 查找两者中的所有SKU,非活动以及从目标中删除软件
  5. 在不运行双循环的情况下执行此操作的最佳做​​法是什么?宁愿使用LINQ 4 Objects解决方案,因为我已经拥有了我的对象。

    编辑:顺便说一下,我需要在前2个实例中将信息从Feed行传输到目标行,只需在最后一个实例中设置一个标志。

    TIA

1 个答案:

答案 0 :(得分:1)

LINQ-to-objects方法就像演示一样。在这里,我有两个字符串列表,我想拉取匹配,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。

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