gpt4 book ai didi

c# - 在查询中更改 Linq To Sql 实体的属性

转载 作者:行者123 更新时间:2023-11-30 15:46:18 24 4
gpt4 key购买 nike

我有 2 个表 Products 和 ProductDetails。 Products 包含关于我的库存的所有信息,ProductDetails 用于允许在产品价格变化生效之前在系统中更新它们。

我正在尝试编写一个简单的查询,该查询返回所有产品,并且如果在 ProductDetails 中找到匹配行且开始日期小于或等于当前日期,则还更新产品的成本和价格。到目前为止我所拥有的是:

var products = from p in Products
from pd in ProductDetails
.Where(pd => pd.ProductID == p.ID && pd.CommenceDate <= DateTime.Now)
.DefaultIfEmpty()
where p.InUse == true
select p;

我首先想到我可以通过在选择中声明一个新产品来实现我所追求的目标,例如:

var products = from p in Products
from pd in ProductDetails
.Where(pd => pd.ProductID == p.ID && pd.CommenceDate <= DateTime.Now)
.DefaultIfEmpty()
where p.InUse == true
select new Product {
ID = p.ID,
Description = p.Description,
....
Cost = pd.Cost.HasValue ? pd.Cost : p.Cost,
Price = pd.Price.HasValue ? pd.Price : p.Price,
...
};

此代码给我以下错误:

Explicit construction of entity type 'LINQPad.User.Product' in query is not allowed

是否有一种简单的方式来表示“退回产品并有选择地替换某些属性值”?

最佳答案

您有 3 个选择:

  • 获取项目后处理它们 - 即

    var products = ( /* first query */ ).ToList();
    foreach(var item in products) {
    item.Cost = ...;
    item.Price = ...;
    }
    // and probably submit changes
  • 创建一个不相关的类型(在模型之外)以转换到其中;甚至匿名类型:

    var products = /* most of second query */
    select new { // <==== not a Product
    ID = p.ID,
    Description = p.Description,
    ....
    Cost = pd.Cost.HasValue ? pd.Cost : p.Cost,
    Price = pd.Price.HasValue ? pd.Price : p.Price,
    ...
    };
  • 与上面的几乎相同,但破坏了组合(通过 AsEnumerable(),这意味着我们为接下来的任何事情恢复到 LINQ-to-Objects)并创建一个更改的版本数据上下文之外

    var products = from prod in (/* first query */).AsEnumerable()
    select new Product {
    ID = p.ID,
    Description = p.Description,
    ....
    Cost = pd.Cost.HasValue ? pd.Cost : p.Cost,
    Price = pd.Price.HasValue ? pd.Price : p.Price,
    ...
    };

编辑评论;另一种选择是迭代器 block ;迭代器 block 是流媒体设备;编译器编织了很多魔法来确保您的代码一次只处理一项(“yield return”)——它不会在返回任何内容之前读取所有数据:

static IEnumerable<Product> SomeMethod(IEnumerable<Product> products) {
foreach(p in products) {
p.Foo = ...
p.Bar = ...
yield return p;
}
}

现在通过该方法传递产品序列。

关于c# - 在查询中更改 Linq To Sql 实体的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4419700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com