Asp.net mvc 3 LINQ使用列表左连接<;字符串>;

Asp.net mvc 3 LINQ使用列表左连接<;字符串>;,asp.net-mvc-3,linq,linq-to-entities,Asp.net Mvc 3,Linq,Linq To Entities,假设您有一个ID列表: string str = "82174F2000000, 82174F2000001, 82174F2000002, 82174F2000003, 82174F2000004, 82174F2000005"; 你可以这样做: var tids = new List<string>(str.Replace(", ", ",").Split(',')); var tntable = tids.AsQueryable(); 看起来tntable没有名为“CarI

假设您有一个ID列表:

string str = "82174F2000000, 82174F2000001, 82174F2000002, 82174F2000003, 82174F2000004, 82174F2000005";
你可以这样做:

var tids = new List<string>(str.Replace(", ", ",").Split(','));
var tntable = tids.AsQueryable();
看起来tntable没有名为“CarID”的字段

有人能帮忙吗

这是用于LINQ到实体的

我看到了这一点:

但我不知道怎么做左连接

蒂亚

我知道这很长;但是谢谢你的阅读

为MichaC更新:

在CTable的数据库中,我们有以下CARID:

CarID
_____
82174F2000000
82174F2000001
82174F2000002
82174F2000003
假设表(tntable)包含分解为记录的字符串:

CarID
_____
82174F2000000
82174F2000001
82174F2000002
82174F2000003
82174F2000004
82174F2000005
这样的左连接:

SELECT C.CarID, T.CarID
FROM CTable C
LEFT JOIN tntable T ON C.CarID = T.CarID
var line = from c in db.Ctable
           where tntable.Contains(c.CarID)
           select new 
           {
              Name =  c.OwnerName,
              Hours = c.Hours
           };
将为您提供以下信息:

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

如果我正确地阅读了您的问题,那么看起来您希望根据ID列表进行筛选,而不是执行左连接。我想你想要这样的东西:

SELECT C.CarID, T.CarID
FROM CTable C
LEFT JOIN tntable T ON C.CarID = T.CarID
var line = from c in db.Ctable
           where tntable.Contains(c.CarID)
           select new 
           {
              Name =  c.OwnerName,
              Hours = c.Hours
           };
更新:您可以将包含检查移动到select语句以返回所有内容

var line = from c in db.Ctable
           select new 
           {
              IsMatch = tntable.Contains(c.CarID),
              Name =  c.OwnerName,
              Hours = c.Hours
           };
更新2:好的,这个怎么样。使用my original从SQL中提取相关项,然后使用Linq to对象以您想要的方式实际构建列表。.ToList()强制它进行SQL查询。也可以使用.AsEnumerable()


如果我正确地阅读了您的问题,那么看起来您希望根据ID列表进行筛选,而不是执行左连接。我想你想要这样的东西:

SELECT C.CarID, T.CarID
FROM CTable C
LEFT JOIN tntable T ON C.CarID = T.CarID
var line = from c in db.Ctable
           where tntable.Contains(c.CarID)
           select new 
           {
              Name =  c.OwnerName,
              Hours = c.Hours
           };
更新:您可以将包含检查移动到select语句以返回所有内容

var line = from c in db.Ctable
           select new 
           {
              IsMatch = tntable.Contains(c.CarID),
              Name =  c.OwnerName,
              Hours = c.Hours
           };
更新2:好的,这个怎么样。使用my original从SQL中提取相关项,然后使用Linq to对象以您想要的方式实际构建列表。.ToList()强制它进行SQL查询。也可以使用.AsEnumerable()


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

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

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

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
                      };
看看这个:

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 );
}
如果这不是你想要的,那么仔细看看

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

看看这个:

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 );
}
如果这不是你想要的,那么仔细看看


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

我不仅想知道CTable中有什么,而且还想返回NULL(不在CTable中)。您的示例只返回CTable中的内容。谢谢如果它有效的话,那就太酷了。我现在就试试,然后回来汇报。米哈奇,这是让它发挥作用的一种方法,但它不是真正的左键连接。您可以看到CTable有数百万条记录,上面的内容将返回数百万条记录。你知道如何做左连接,这样它最多只能返回字符串中的内容吗?我想问题是我不太明白你在找什么。选项A将只返回匹配项,而不是数百万行,但您的第一条评论向我建议,您希望返回所有内容,并指示每一行是否在列表中,因此选项B。如果您不希望所有数百万非匹配项(不在tntable中的项)的所有者名称和小时数选项A不是给了你所需要的一切吗?你需要不匹配的计数吗?谢谢MichaC,我已经编辑了这个问题,并详细说明了我要实现的目标,请参阅“为MichaC更新:”。这有意义吗?谢谢我不仅想知道CTable中有什么,而且还想返回NULL(不是CTable中的)。您的示例只返回CTable中的内容。谢谢如果它有效的话,那就太酷了。我现在就试试,然后回来汇报。米哈奇,这是让它发挥作用的一种方法,但它不是真正的左键连接。您可以看到CTable有数百万条记录,上面的内容将返回数百万条记录。你知道如何做左连接,这样它最多只能返回字符串中的内容吗?我想问题是我不太明白你在找什么。选项A将只返回匹配项,而不是数百万行,但您的第一条评论向我建议,您希望返回所有内容,并指示每一行是否在列表中,因此选项B。如果您不希望所有数百万非匹配项(不在tntable中的项)的所有者名称和小时数选项A不是给了你所需要的一切吗?你需要不匹配的计数吗?谢谢MichaC,我已经编辑了这个问题,并详细说明了我要实现的目标,请参阅“为MichaC更新:”。这有意义吗?谢谢错误是此“l.CarID”b/c tntable没有名为“CarID”的字段。所以我在想,我是否必须创建一个名为“CarID”的字段的模型(类),然后创建一个列表table2=newlist();然后将字符串中的每个值添加到它的。这有意义吗?谢谢啊,我用LINQ to对象测试了这个问题,它在那里工作得很好,我无法重现我创建DB模型时的特定错误——如果错误更隐晦的话(这个方法支持LINQ to Entities基础结构,不打算直接从代码中使用)。很明显,我对实体框架了解不够,无法提供您的答案。对不起,谢谢vossad01的努力;但你知道我喜欢你的空。再次感谢。错误是此“l.CarID”b/c tntable没有名为“CarID”的字段。所以我在想,我是否必须创建一个名为“CarID”的字段的模型(类),然后创建一个列表table2=newlist();然后将字符串中的每个值添加到它的。这有意义吗?谢谢啊,我用LINQ to对象测试了这个问题,它在那里工作得很好,我无法重现我创建DB模型时的特定错误——如果错误更隐晦的话(这个方法支持LINQ to Entities基础结构,不打算直接从代码中使用)。很明显,我对实体框架了解不够,无法提供您的答案。对不起,谢谢你