使用LINQ to SQL获取连接结果

时间:2015-04-20 16:23:18

标签: c# linq linq-to-sql

我是LINQ的新手。我正在尝试加入两个表,但是我很难返回结果。

这是我的代码:

 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,当我在'using'之前声明变量时(在它之前),如:var list;

我收到错误:

  

必须初始化隐式类型的局部变量

更新

我将代码更改为:

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的问题?

1 个答案:

答案 0 :(得分: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();
    }
}

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

using (DatabaseDataContext db = new DatabaseDataContext())
{
    var results = db.Products.Join(db.ProductDetails, p => p.ID, d => d.ProductID,
        (p, d) => new
        {
            p.ID,
            p.Photo,
            d.Name,
            d.LanguageID,
        })
        .Where(x => x.LanguageID == languageId)
        .ToList();
    // do stuff with results
}