Asp.net mvc 3 LINQ使用列表左连接<;字符串>;
假设您有一个ID列表: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
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基础结构,不打算直接从代码中使用)。很明显,我对实体框架了解不够,无法提供您的答案。对不起,谢谢你