- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,我有一个 Product 实体、一个 ProductViewModel 和一个 Label 实体。我的两个产品属性对应于标签代码而不是实际值。例如,产品的名称是“code1234”,它对应于具有“code1234”作为代码和“Milk”作为值的标签。标签没有作为外键加入。我们正在使用 AutoMapper 进行投影。
public class Product{
public int ProductId {get; set;}
public string Name {get; set;}
public string Description {get; set;}
}
public class ProductViewModel{
public int ProductId {get; set;}
public string Name {get; set;}
public string Description {get; set;}
}
public class Label{
public int LabelId {get; set;}
public string Code {get; set;}
public string Value {get; set;}
public int LanguageId {get; set}
}
var currentLanguageId = 1; //As an example
IQueryable<Product> queryFromDb;
var Products = queryFromDb
.ProjectTo<ProductViewModel>().AsEnumerable();
foreach(var Product in Products) {
Product.Name = db.Labels.Where(x => x.Code == Product.Name && x.LanguageId == currentLanguageId).Single().Value;
Product.Description = db.Labels.Where(x => x.Code == Product.Description && x.LanguageId == currentLanguageId).Single().Value;
}
var result = scope.GetRepository<Product>().GetAll() //returns Queryable<Product>
.ProjectTo<ProductViewModel>(_mapper.ConfigurationProvider) //returns Queryable<ProductViewModel>
.WithLabels(_mapper, scope, x => x.Name, x => x.Description) //returns Queryable with columns replaced with a query
.ToDataResult(request); //sorts filters takes skips, etc.
public static IQueryable<T> WithLabels<T>(this IQueryable<T> instance,
IMapper mapper,
IBaseReadContextScope scope,
params Expression<Func<T, string>>[] expressions) where T : class
{
var currentLanguage = 1; //as an example
var labels = scope.GetRepository<Label>().GetAll(x => x.Language == currentLanguageId);
foreach (var expression in expressions)
{
var query = instance
.GroupJoin(
labels,
expression,
label => label.Code,
(x, y) => new { Obj = x, Label = y })
.SelectMany(
xy => xy.Label.DefaultIfEmpty(),
(x, y) => new { Obj = x.Obj, Label = y })
.Select(s => new ObjectWithLabel<T>()
{
Object = s.Obj,
Label = s.Label
});
instance = mapper.ProjectTo<T>(query, new { propertyName = ExpressionUtilities.PropertyName(expression) });
}
return instance;
}
CreateMap<ObjectWithLabel<ProductViewModel>, ProductViewModel>()
.ForMember(x => x.Name, m =>
{
m.Condition(x => propertyName == nameof(ProductViewModel.Name));
m.MapFrom(x => x.Label.Value);
})
.ForMember(x => x.Name, m =>
{
m.Condition(x => propertyName != nameof(ProductViewModel.Name));
m.MapFrom(x => x.Object.Name);
})
.ForMember(x => x.Description, m =>
{
m.Condition(x => propertyName == nameof(ProductViewModel.Description));
m.MapFrom(x => x.Label.Value);
})
.ForMember(x => x.Description, m =>
{
m.Condition(x => propertyName != nameof(ProductViewModel.Description));
m.MapFrom(x => x.Object.Description);
});
Dictionary<string, IQueryable<string>> dictionary = null;
CreateMap<Product, ProductViewModel>()
.ForMember(x => x.Name, m => m.MapFrom(x =>
dictionary["Name"]))
.ForMember(x => x.Description, m => m.MapFrom(x =>
dictionary["Description"])));
最佳答案
我不确定我的问题陈述是否正确,而且我认为我的 LINQ 在评论中完全错误。
看来您正在尝试从数据库中加入两个表(并在其中之一上应用 LanguageId 过滤器)。
我相信使用 EF.Core 3(我假设您使用最新的),您不需要定义 FK 来连接表:
var Products = db.Products.Join(
db.Labels.Where(l => l.LanguageId == 1), product => product.Name,
label => label.Code,
(p, l) => new {p, l})
.Join(db.Labels.Where(l => l.LanguageId == 1), p => p.p.Description, l => l.Code,
(pp, l) => new ProductViewModel { Name = pp.l.Value, ProductId = pp.p.ProductId, Description = l.Value});
SELECT [t].[Value] AS [Name], [p].[ProductId], [t0].[Value] AS [Description]
FROM [Products] AS [p]
INNER JOIN (
SELECT [l].[LabelId], [l].[Code], [l].[LanguageId], [l].[Value]
FROM [Labels] AS [l]
WHERE [l].[LanguageId] = 1
) AS [t] ON [p].[Name] = [t].[Code]
INNER JOIN (
SELECT [l0].[LabelId], [l0].[Code], [l0].[LanguageId], [l0].[Value]
FROM [Labels] AS [l0]
WHERE [l0].[LanguageId] = 1
) AS [t0] ON [p].[Description] = [t0].[Code]
ProductViewModel
就在 select 语句中。
关于c# - 如何在不执行 Queryable 的情况下以通用方式替换 Queryable<T> 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60777749/
重现问题的代码 我遇到了一个 IQueryable.Where 的情况电话返回 IQueryable其中 TOther != TSource .我整理了一些示例代码来重现它: using System
例如,我有一个 Product 实体、一个 ProductViewModel 和一个 Label 实体。我的两个产品属性对应于标签代码而不是实际值。例如,产品的名称是“code1234”,它对应于具有
我正在使用 Diesel crate执行一些数据库工作。在某些表中,应将表的两列一起视为一个键。 这种模式在数据库中的许多地方都重复出现,因此最好避免使用大量重复的复制粘贴代码来处理这种情况。但是,我
我正在使用 EF6 为应用程序实现搜索/筛选器 UI 的后端。我有代码构建一个与 Queryable.Where 一起使用的表达式,对于给定的 DbSet,DbSet 的类型在运行时确定(DBCo
我有一个数据库查询: var configs = dbData.Configs.Where(e => headers.Contains(e.headerId) && e.flag == "true")
如何声明这样的变量? var rData = from nc in ctx.NEWSLETTER_CLIENTS join ni
1.在数据库中以json字符串格式保存,如:[{"name":"张三","time":"8.592","ar
重要 问题不是“Queryable.OfType 有什么作用,而是“我在那里看到的代码是如何实现的?” 反射(reflection) Queryable.OfType,我看到(经过一些清理):
你怎么了黑帮? 我有以下代码似乎总是返回 null。 public static T GetNext(this IQueryable list, T current) {
我有以下代码 var results = repository.GetItemsAsQuery().Where( user =>
我正在编写一个转换 IQueryable 查询的访问者。它使用带有种子 null 的 Aggregate 方法,然后使用一些 func 对其进行转换。我的问题是这个 null 是 decimal? 类
我有这个存储库方法: public IQueryable GetAll() { using (var context = new DatabaseContext()) {
我不太了解界面,所以我想我会以一种有助于我更好地理解它的方式来表述这个问题。 我正在学习如何制作 IQueryable 的教程。为什么我不能只做一个 Queryable? 最佳答案 Queryable
我对 Linq 有点陌生,希望有人能帮助我解决我目前正在苦苦挣扎的事情。 我目前有 2 个列表 public IQueryable Roles { get { var role
我有一个 ASP.NET 站点,它已经完美运行了很长时间,最近没有任何变化。从一个小时到下一个小时,我开始在我执行 LINQ 查询的一行中收到 IndexOutOfRangeException: va
我想知道如何在列表中存储 orderby 表达式。这就是我想写的: List>> list = new List>>() { p => p.Name, p => p.Id }; 然后: var
我正在构建一个基于 LINQ 的查询生成器。 其中一项功能是能够将任意服务器端投影指定为查询定义的一部分。例如: class CustomerSearch : SearchDefinition {
我正在尝试在我的 API 中实现 Guardian 并通过它执行登录以获取 JWT。我正在看的教程是here .问题是使用类似于他们在示例中使用的用户模型来实现登录。模型代码如下所示: defmodu
我有一个简单的 GET 方法,它返回 IQueryable,并且对查询有一些先决条件: [Queryable(HandleNullPropagation = HandleNullPropagation
我有一个简单的 WebApi 方法,就像这样用 OData 可查询属性装饰。 [Queryable] public virtual IQueryable Get() {
我是一名优秀的程序员,十分优秀!