2015-04-20 21 views
1

我是LINQ的新手。我试图加入两张表格,但我很难返回结果。使用LINQ to SQL获取连接结果

这里是我的代码:

using (DatabaseDataContext db = new DatabaseDataContext()) 
    { 
     var list = db.Products.Join(db.ProductDetails, 
     p => p.ID, 
     d => d.ProductID, 
     (p, d) => new { 
     p.ID,p.Photo,d.Name,d.LanguageID 
     }).Where(d=>d.LanguageID== lang).ToList(); 
    } 

嗯,我不能使用变量list使用外,当我宣布(之前)的变量外“使用”,如:var list;

我得到的错误:

Implicitly-typed local variables must be initialized

更新:

我改变了代码:

DatabaseDataContext db = new DatabaseDataContext(); 

         var products = db.Products.Join(db.ProductDetails, 
          p => p.ID, 
          d => d.ProductID, 
          (p, d) => new { 
           p.ID,p.Photo,d.Name,d.LanguageID 
          }).Where(d=>d.LanguageID== langs[language].ParseInt()).ToList(); 

和它的工作。由于我省略了using,我是否必须像关闭连接一样做任何事情?

有问题没有使用using

回答

3

如果您不使用同一范围内的查询结果,则必须将其输入,以便可以声明适当类型的变量。首先为结果对象定义一个类并使用它。将这一切作为一种方法将会更清洁。

public class Result 
{ 
    public int ID { get; set; } 
    public string Photo { get; set; } 
    public string Name { get; set; } 
    public int LanguageID { get; set; } 
} 
public List<Result> GetJoinResult(int languageId) 
{ 
    using (DatabaseDataContext db = new DatabaseDataContext()) 
    { 
     return db.Products.Join(db.ProductDetails, p => p.ID, d => d.ProductID, 
      (p, d) => new Result // not anonymous 
      { 
       ID = p.ID, 
       Photo = p.Photo, 
       Name = d.Name, 
       LanguageID = d.LanguageID, 
      }) 
      .Where(x => x.LanguageID == languageId) 
      .ToList(); 
    } 
} 

如果定义类型的实在是太多了,那么你就必须立即使用它在同一范围内。

​​
+0

我知道,但对于很多很多的结果,我会从不同的联接得到我不想为他们每个人的(因为好奇心和懒惰)创建结构或类,我想知道我怎么能得到的结果不重要使用'使用'任何我可能的方式 –

+0

@AshkanMobayenKhiabani你不能从方法返回一个匿名类型。在这种情况下,你必须在方法内部完成所有的逻辑。创建所有模型更好。 –

+0

我在我的问题中添加了一个更新,请你看看它并说出你的意见吗? –