2010-10-16 46 views
1

我研究过这个死亡。这里似乎已经有了一些答案,但坦率地说,答案让我感到困惑。所以我会尽量让这个尽可能基本。LinqtoSQL与where子句包含一个列表?

如果我在数据库中有一个表,名为列(字符串)和年龄(int)列的“People”。然后我做这样的事情:

List<int> ages = new List<int>(); 
ages.Add(39); 
ages.Add(40); 
var result = from p in People 
where ages.Contains((int)p.Age) 
select p; 

语法是传递,但没有返回(在VS2010和LinqPad)。难道这不应该使用包含列表中的年龄的where子句生成SQL语句吗?

简单的回答任何人? (理想情况下,如果你可以修改我的例子,并使其工作..这将是伟大的!)

+0

什么是p.Age的数据类型?你可以发布结果SQL查询,无论是与context.Log = Console.Out或从SQL事件探查器? – 2010-10-16 14:18:40

+0

顺便问一下,这是linq2objects还是linq2SQL? – 2010-10-16 14:19:10

+0

哦,我只铸造了p.Age(这是一个Int),因为它在db中是可选的。另外,如果你阅读上面的“人物”是一个数据库表,但显然年龄是一个对象。 – CraigF 2010-10-16 14:27:53

回答

2

如果你正在做它作为Linq2SQL,它看起来你做得正确,以确保适当的预测SQL Server。你可以尝试写一个稍微不同的方式,如:

var result = from p in People 
where ages.Select(a => a).Contains(p.Age) 
select p; 

你说它什么都没有返回。你确定有匹配的记录要返回吗?另外,您是否在任何地方使用result?如果您没有将其绑定到某个项目,或者将ToList()调用到其他投影交互,则查询将不会执行。从评论

样品:

var ints = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

var Merchandiser = (new DataClasses1DataContext()).Merchandisers; 

var result = from m in Merchandiser 
where ints.Contains(m.Id) 
select m; 

foreach (var item in result) 
{ 
    Console.WriteLine(item.Name); 
} 

Console.ReadLine(); 
+0

是的,我在数据库中有5个条目。 5人,年龄从39岁到41岁不等。我似乎无法让你的语法正常工作。 – CraigF 2010-10-16 14:39:10

+0

在你的例子中,lambda表达式中的a将是一个int,它没有“Contains”定义 – CraigF 2010-10-16 14:41:00

+0

对不起,必须学会在发布之前完成咖啡SO 我尖刺了这个,它适用于我 var ints = new List {1,2,3,4,5,6,7,8,9,10}; var merchandiser =(new DataClasses1DataContext())。Merchandisers; var result = from m in Merchandiser where ints.Contains(m.Id) select m; foreach(var item in result) { Console.WriteLine(item.Name); } Console.ReadLine(); 那么你确定你连接到数据库和结果表吗? – 2010-10-16 14:52:13