将Linq查询分配给对象类型

时间:2010-12-23 21:58:12

标签: sql linq-to-sql

我正在学习Linq to Sql;

您是否总是直接将查询作为业务对象类型的赋值传递,如“返回行”中所做的那样?这有什么限制?有什么要求;属性名称必须等于数据库列名?

如果:

  1. 除了保存在数据库中的属性外,业务对象还有其他属性
  2. 业务对象缺少一个与列名匹配的属性?
  3. 有关限制和需要注意的事项的任何其他相关信息都将非常有用。

    示例:

    public List<Beer> GetAllBeers()
    {
        DataClassesDataContext db = new DataClassesDataContext();
        var beers = from b in db.Beers
                    orderby b.BeerName
                    select b;
        return beers.ToList<Beer>();
    }
    

2 个答案:

答案 0 :(得分:1)

不是不总是这样......但是当你为linq配置你的应用程序时,它很常见,你最终会得到你的域和数据模型的映射。

然而,您可以使用投影将结果塑造成您想要的任何类别或值类型......

DataClassesDataContext db = new DataClassesDataContext();
var suppliers = from b in db.Beers
                orderby b.BeerName
                select b.Supplier;

这将只返回供应商属性的IEnumerable<string>

或者使用匿名类甚至是你自己的类,你也可以投射到它......

var suppliers = from b in db.Beers
                orderby b.BeerName
                select new ()
                {
                  Supplier = b.Supplier,
                  BeerName = b.BeerName
                };

或你自己的班级......

var suppliers = from b in db.Beers
                orderby b.BeerName
                select new MyClass()
                {
                  Supplier = b.Supplier,
                  BeerName = b.BeerName
                };

答案 1 :(得分:1)

当您创建dbml文件并在画布上拖动Beer表时,设计器会为您生成一个名为Beer的类。默认情况下,此类将1-1映射到表 - 每列的属性,相同的数据类型等。

如果您愿意,可以更改这些属性 - 您可以更改它们的名称和数据类型,您可以删除它们(如果删除它们,它们将需要在数据库中可以为空),您可以添加不一定的属性映射到数据库,依此类推。

实例化数据上下文对象时,可以使用Beer从数据库中检索这些db.Beers对象(类,而不是表)。 LINQ-to-SQL根据设计器中规定的规则填充这些对象 - 即哪个列映射到哪个属性,数据类型等。类上没有映射到列的任何属性都将被赋予默认值,就像一个普通的初始化对象一样。

您可以像使用任何其他对象一样使用这些对象;它们只是具有附加属性的类。您可以在位于dbml文件后面的MyDatabase.designer.cs文件中看到它们。将它们放在一个列表中并返回它们,将它们投影到其他对象中,只选择它们的id属性 - 无论你需要做什么。