1

假设您有一个 ID 列表:

string str = "82174F2000000, 82174F2000001, 82174F2000002, 82174F2000003, 82174F2000004, 82174F2000005";

你这样做:

var tids = new List<string>(str.Replace(", ", ",").Split(','));
var tntable = tids.AsQueryable();

您想将其与带有左连接的表进行比较:

var line = from c in db.Ctable
 join l  in tntable on c.CarID equals l.CarID into c_j
  from l in c_j.DefaultIfEmpty()
  select new
  {
 Name =  c.OwnerName,
 Hours = c.Hours
  };

看起来 tntable 没有名为“CarID”的字段。

有人可以帮忙吗?

这是针对 LINQ to Entity 的。

我见过这个:

如何使用 LINQ 将 List<String> 与 DB 表进行比较

但不知道做一个 LEFT JOIN。

蒂亚!

我知道这很长;但感谢阅读。

为 MichaC 更新:

在 CTable 的数据库中,我们有这些 CarID:

CarID
_____
82174F2000000
82174F2000001
82174F2000002
82174F2000003

假设表 (tntable) 包含分解为记录的字符串:

CarID
_____
82174F2000000
82174F2000001
82174F2000002
82174F2000003
82174F2000004
82174F2000005

所以,像这样的 LEFT JOIN:

SELECT C.CarID, T.CarID
FROM CTable C
LEFT JOIN tntable T ON C.CarID = T.CarID

会给你这个:

T.CarID         C.CarID
_______         _______
82174F2000000   82174F2000000
82174F2000001   82174F2000001
82174F2000002   82174F2000002
82174F2000003   82174F2000003
82174F2000004   NULL
82174F2000005   NULL 
4

3 回答 3

1

如果我正在阅读您的问题,那么您似乎想根据 ID 列表进行过滤,而不是执行左连接。我想你想要这样的东西:

var line = from c in db.Ctable
           where tntable.Contains(c.CarID)
           select new 
           {
              Name =  c.OwnerName,
              Hours = c.Hours
           };

更新:您可以将包含检查移动到选择语句以返回所有内容。

var line = from c in db.Ctable
           select new 
           {
              IsMatch = tntable.Contains(c.CarID),
              Name =  c.OwnerName,
              Hours = c.Hours
           };

更新2:好的,这个怎么样。使用我的原件从 SQL 中提取相关项目,然后使用 Linq to Objects 以您想要的方式实际构建列表。.ToList() 强制它进行 SQL 查询。您也可以使用 .AsEnumerable()。

var filtered = from c in db.Ctable
           where tntable.Contains(c.CarID)
           select new 
           {
              CarID = c.CarID,
              Name =  c.OwnerName,
              Hours = c.Hours
           };

var line = from x in tntable
           join i in filtered.ToList() on x equals u.CarID into i_match
           from i in i_match.DefaultIfEmpty()
           select { x, i };
于 2012-07-10T00:42:29.490 回答
0

从您的评论中,您希望 null 仍然为每个 ID 选择一个对象,tntable即使在ctable? 如果我理解正确的话,我相信这会给你想要的效果。

var desired = from l in tntable
              join c in ctable on l equals c.CarID into lj
              from c in lj.DefaultIfEmpty()
              select
                  new
                      {
                          Name = c == null ? null : c.OwnerName,
                          Hours = c == null ? (int?)null : c.Hours
                      };
于 2012-07-10T01:26:38.807 回答
0

看看这个:

string str = "Pat, Boots";
var names = new List<string>(str.Replace(", ", ",").Split(',')).AsQueryable();

Pet defaultPet = new Pet { Name = "Default Pet", Age = -1 };

List<Pet> pets1 = new List<Pet>{ 
            new Pet { Name="Barley", Age=8 },
            new Pet { Name="Boots", Age=4 },
            new Pet { Name="Whiskers", Age=1 } 
    };

var pets = from name in names
            join pet in pets1 on name equals pet.Name into gj
            from subpet in gj.DefaultIfEmpty(defaultPet)
            select new { Name = name, Age = subpet.Age };


foreach(var newPet in pets) {
    Console.WriteLine("\nName: {0}, Age: {1} ", newPet.Name, newPet.Age );
}

这会产生:

Name: Pat, Age: -1
Name: Boots, Age: 4

如果这不能满足您的要求,请仔细查看MSDN 上的 How to: Perform Left Outer Joins (C# Programming Guide)

我为 DefaultIfEmpty() 使用了上面的链接和 MSDN 的帮助页面。

于 2012-07-10T08:45:04.813 回答