2011-08-31 56 views
0

我一直忽略对LINQ的需求,通过迭代对象,但最近决定留下旧学校方法和时间。Linq帮助请..直接铸造到对象而不是Var

我想知道是否有人可以通过首先使用Lambda代替老派Linq来简化下面的代码,其次,下面的代码将总是只返回1个值。我如何直接转换为正确的类型(玩家)在这种情况下,无需再次迭代?

MyEntities entity = new MyEntities(); 

    Guid selectedPlayerID = Guid.Parse(lbPlayers.SelectedItem.Value); 


    var player = from n in entity.Players 
       where n.ID == selectedPlayerID 
       select n; 

    foreach (var item in player) 
    { 
     tbPlayerSurname.Text = item.Name; 
     tbPlayerName.Text = item.Surname;  
    } 
+0

谢谢大家。这是超快速和伟大的答案...从发布到解决方案14分钟..你不能像任何地方购买支持合同 – Fox

回答

3

如果entity.Players包含播放器对象,可以简单地指定

IEnumerable<Player> players = entity.Players 
.Where(p => p.ID == selectedPlayerID); 

我无法理解你的文章,所以我最初的回答实际上只选择一个(和阅读评论我看到是你想要的),你可以这样做:如果没有excatly一个

Player player = entity.Players.Single(p => p.ID == selectedPlayerID); 

这将引发和错误,你可以使用的SingleOrDefault和检查空,甚至FirstOrNull,在这种情况下,你可能会吞下一个潜在的错误,如果有超过一个和第四在被认为陷入

+0

谢谢。这工作完美!欣赏它。 – Fox

+0

请注意,如果您确定它会**返回值,则应该使用'Single''并让CLR为您抛出异常,以防返回多于/少于1个结果。 –

+0

我敢肯定,它将始终返回一个值,只有1 .. ID列是一个表上的主键列GUIDs – Fox

1
var blahs = entity.Players.Where(x => x.ID == selectedPlayerID) 
        .Select(x => new blah() { Name = x.Name, Text = x.Surname); 

这给你一个IEnumerable<Blah>

是否有意义?

+0

谢谢埃里克。这提供了另一种方式,但PerHornshøj-Schierbeck的解决方案对我来说最适合。谢谢。 – Fox

1

您可以使用:

entity.Players.Single(n=>n.ID==selectedPlayerId); 

,如果你认为它可能不存在使用的SingleOrDefault(和检查返回值是在类案件不同于默认值,NULL)。 如果你只关心第一个使用First或FirstOrDefault的话。

1

试试下面这段代码,如果** entity.Players的类型是名单<球员的>

List<Player> selectedPlayers = (from n in entity.Players 
           where n.ID == selectedPlayerID select n).ToList(); 

如果entity.Players的类型是名单<球员的不>

List<Player> selectedPlayers = (from n in entity.Players 
           where n.ID == selectedPlayerID 
           select new Player() { Name = n.Name, Surname = n.Surname }); 
+0

感谢队友。是的,entity.Players包含Player对象。对我来说,easist解决方案是:Player player = ent.Players.SingleOrDefault(p => p.ID == selectedPlayerID); 我应该提到该实体包含强类型对象。 – Fox

+0

很好。快乐编码..我们可以从很多答案中学到很多东西。这是StackOverflow中最棒的部分。 – Somnath